Get_or_create kullanmanın doğru yolu?


204

Formlarımdaki bazı alanlar için get_or_create kullanmaya çalışıyorum, ancak bunu yapmaya çalıştığımda 500 hata alıyorum.

Çizgilerden biri şöyle görünür:

customer.source = Source.objects.get_or_create(name="Website")

Yukarıdaki kod için aldığım hata:

Cannot assign "(<Source: Website>, False)": "Customer.source" 
   must be a "Source" instance.

Yanıtlar:


354

Get_or_create dokümanlarından :

# get_or_create() a person with similar first names.

p, created = Person.objects.get_or_create(
    first_name='John',
    last_name='Lennon',
    defaults={'birthday': date(1940, 10, 9)},
)

# get_or_create() didn't have to create an object.
>>> created
False

Açıklama: Benzerlik açısından değerlendirilecek alanların dışarıda belirtilmesi gerekir defaults. Geri kalan alanların dahil edilmesi gerekir defaults. CREATE olayı meydana gelirse, tüm alanlar dikkate alınır.

Görünüşe göre, tek bir değişken yerine bir demet içine geri dönmeniz gerekiyor:

customer.source,created = Source.objects.get_or_create(name="Website")

3
Yaratılan FYI bir boolean. Oluşturulduysa doğru, getirilirse yanlış
Josh

3
Ek save()bir fazlalık mı?
19'da zypro

@zypro Tıpkı bir create()nesne yaratın ve hepsini tek adımda kaydedin ve buna gerek yoksave()
Amin Mir

32

get_or_create bir tuple döndürür.

customer.source, created = Source.objects.get_or_create(name="Website")

16
Veya, boolean bayrağını umursamıyorsanız:customer.source = Source.objects.get_or_create(name="Website")[0]
mipadi

7
mipadi customer.source, _ = Source.objects.get_or_create(name="Website"), bir tuplein daha açık bir şekilde geri döndürülmesini sağlayarak gelecekteki hataların önlenmesine yardımcı olduğu için tercih ederim .
Solomon Ucko

15

get_or_create() bir tuple döndürür:

customer.source, created  = Source.objects.get_or_create(name="Website")
  • created bir boolean değerine sahiptir, oluşturulur veya oluşturulmaz.

  • customer.source bir get_or_create()yöntem nesnesi vardır .


12

@Tobu yanıtı ve @mipadi yorumunu takiben, daha pythonic bir şekilde, oluşturulan bayrakla ilgilenmiyorsanız, kullanacağım:

customer.source, _ = Source.objects.get_or_create(name="Website")

4

Karşılaştığınız sorun belgelenmiş bir özelliğidir get_or_create.

"Varsayılanlar" dışında bir anahtar kelime bağımsız değişkeni kullanıldığında, döndürülen değeri get_or_createbir örnektir. Bu nedenle parens'i dönüş değerinde gösteriyor.

customer.source = Source.objects.get_or_create(name="Website")[0]doğru değeri elde etmek için kullanabilirsiniz .

Dokümanların bağlantısı: http://docs.djangoproject.com/en/dev/ref/models/querysets/#get-or-create-kwargs

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.