2011-08-17 15 views
6

Bu kodun neden yinelenen bir girdiye neden olduğunu anlamama yardımcı olabilir misiniz (IntegrityError)?Django - get_or_create çalışmıyor

Django 1.2'deyim.

(row, is_new) = MyModel.objects.get_or_create(field1=1) 
row.other_field = 2 
row.save() 

Alan1 üzerinde benzersiz bir kısıtlama var. Eğer field1 = 1'in olduğu bir satır varsa, her şey yolunda gidiyor, Django bir "get" yapıyor.

Eğer field1 = 1'in olduğu bir satır yoksa, Django'nun o satırı iyi oluşturduğu anlaşılıyor. Ama neden kurtarmama izin vermiyor?

Güncelleme:

class MyModel(models.Model): 
    id = models.BigIntegerField(primary_key=True) 
    field1 = models.BigIntegerField(unique=True) 
    other_field = models.CharField(max_length=765) 
    class Meta: 
     db_table = u'project_crosses_suppl_FO' 

field1 başka bir tabloya yabancı anahtardır: Eğer yardımı olacaksa

, burada MyModel olduğunu. Ama bu tablo için Django'da bir model yapmadım, bu yüzden Django'ya yabancı bir anahtar olduğunu söylemem.

+0

mu MyModel yabancı alanı vardır: Arka arkaya dolayısıyla bu sizin için çalışmalı, bir nesne ile başlık olur? MyModel'in kodunu gönderir misin? –

+1

[Benzer soru] (http://stackoverflow.com/questions/6974463/django-get-or-create-raises-duplicate-entry-with-together-unique) size yardımcı olabilir. – agf

+0

@agf. Çözümde sorunun ne olduğunu veya sorunun nasıl doğrulandığını anlamıyorum. Bana bir böcek gibi geliyor. Ben get_or_create üzerinde pes edeceğim ve etrafında bir iş yapalım düşünüyorum :-( – Greg

cevap

3

get_or_create sesler bana zarar verdi. Etrafa bu işi yapıyorum:

rows = MyModel.objects.filter(field1=1) 
row = rows[0] if rows else MyModel(field1=1) 
row.other_field = 2 
row.save() 
7

Bunun gerçek bir kod makul gerçeğe sadık olduğunu varsayarsak, doğal olarak o Bozulmuş Django değil, sizin modeli.

Otomatik birincil anahtar alanınızı kendi id alanınızla geçersiz kıldınız, ancak bunu bir otomatikleştirme yapmak için ihmal ettiniz. Dolayısıyla veritabanı PK için yeni bir değer kullanmıyor, dolayısıyla bütünlük hatası.

Gerçekten iyi bir nedeniniz olmadıkça, Django'nun PK alanının kendisi ile ilgilenmesine izin vermelisiniz.

+1

Oh bu iyi bir nokta var. Neden Django'ya birincil anahtarın ne olduğunu söylüyorum.Yani tam olarak neyi değiştiririm? MySQL tablosundaki "id" sütunu aslında otomatik artışa ayarlanır. Django'ya otomatik artış alanı olduğunu söylemem gerekir mi? – Greg

+0

@Greg, Bunu zaten denedin mi? – Kirill

1

Get veya Create, kullandığınız alan birincil anahtar veya benzersiz olarak ayarlanmış olsa bile sonuçların bir kopyasını döndürür. senin durumunda Yani

:

(row, is_new) = MyModel.objects.get_or_create(field1=1) 
row[0].other_field = 2 
row[0].save() 
İlgili konular