2015-03-26 8 views
12

Mi piacerebbe utilizzare name__iexact con get_or_create per evitare la duplicazione sui campi immessi dall'utente, ove possibile.Django get_or_create non riesce a impostare il campo quando viene utilizzato con iexact

Il modello del mio provider ha un campo nome che uso in get_or_create.

La ricerca funziona bene, ma quando si crea un'istanza per la prima volta come nell'esempio P1/Legname di seguito (il nome

non riesce:

>>> p1, c1 = Provider.objects.get_or_create(name__iexact="Timber") 
>>> p1, c1 
(<Provider: >, True) 
>>> p1.name 
u'' 

funziona come previsto qui:

>>> p2, c2 = Provider.objects.get_or_create(name="Cedar") 
>>> p2.name, c2 
('Cedar', True) 
>>> p3, c3 = Provider.objects.get_or_create(name__iexact="Cedar") 
>>> p3, c3 
(<Provider: Cedar>, False) 
>>> Provider.objects.get_or_create(name__iexact="cedar") 
(<Provider: Cedar>, False) 

È __iexact incompatibile con la parte di creazione di get_or_create, è questo comportamento previsto (e perché) oppure ho eseguito un errore di Django?

risposta

13

Quello che stai vedendo è il comportamento corretto.

get_or_create è una scorciatoia per 'ottenere e restituire l'oggetto corrispondente kwargs, se non esiste, crearlo utilizzando defaults'. La ricerca sta cercando un oggetto in cui name corrisponde a maiuscole e minuscole a 'cedar'. L'oggetto esiste, quindi viene restituito. Niente di più, niente di meno.

Ora, se non c'era alcuna corrispondenza, Stéphane ha ragione e è necessario specificare name nel parametro defaults. Tutte le ricerche contenenti il ​​separatore di ricerca __ vengono rimosse dai parametri passati a create().

+1

Aha. Quest'ultima frase è la chiave. Eccolo nei documenti: https://docs.djangoproject.com/en/1.7/ref/models/querysets/#get-or-create 'per k, v in kwargs.items() se '__' non è in k' – owenfi

9

Secondo il documentation, si può provare a utilizzare args di default (non hanno provare questo codice):

p1, c1 = Provider.objects.get_or_create(
    defaults={'name':"Timber"}, 
    name__iexact="Timber" 
) 

Ha senso dal momento che si può quindi avere la ricerca e la creazione di oggetti che si differenzia.

Problemi correlati