2015-07-14 15 views
9
Django aşağıdaki modeli kullanıyorum

:Update_or_create alışkanlık saygı eşsiz anahtar

class sfs_upcs(models.Model): 
    upc = models.CharField(max_length=14, unique=True) 
    product_title = models.CharField(max_length=150,default="Not Available") 
    is_buyable = models.NullBooleanField() 
    price = models.DecimalField(max_digits=8, decimal_places=2,default="0.00") 
    image_url = models.URLField(default=None) 
    breadcrumb = models.TextField(default=None) 
    product_url = models.URLField(default=None) 
    timestamp = models.DateTimeField(auto_now=True) 

Sonra benim views.py aşağıdaki kodu kullanıyorum: Ben

def insert_record(upc_dict): 
    upc = upc_dict['upc'] 
    product_title = upc_dict['product_title'] 
    is_buyable = upc_dict['is_buyable'] 
    price = upc_dict['price'] 
    image_url = upc_dict['image_url'] 
    breadcrumb = upc_dict['breadcrumb'] 
    product_url = upc_dict['product_url'] 
    obj, created = sfs_upcs.objects.update_or_create(
    defaults={'product_title':product_title,'is_buyable':is_buyable, 
    'price':price,'image_url':image_url,'breadcrumb':breadcrumb,'product_url':product_url 
    }, 
    upc = upc, 
    product_title = product_title, 
    is_buyable = is_buyable, 
    price = price, 
    image_url = image_url, 
    breadcrumb = breadcrumb, 
    product_url = product_url) 

    print obj,created 

belgelerinde https://docs.djangoproject.com/en/1.8/ref/models/querysets/#update-or-create yılında update_or_create yöntemi mevcut kullanarak ve 'varsayılanları' sözlüğüne nesne hile yapmalıdır bulunması durumunda gÜNCELLENECEK istediğiniz değerlerin geçirilmesi ... ama tarafından ben bir "IntegrityError almaya devam diyor ... sütun upc benzersiz değil "...

Herhangi bir fikrin var mı? filtre değerleri bir nesneyi seçmek için ve aslında güncellenmektedir güncelleme değerler:

+0

kimlik parametresi verin. – Gocht

+0

Ne demek istiyorsun? Birincil anahtar? Ama bu yalnız mı çalışmalı, rigt? – villancikos

+0

'update_or_create' ile bir filtre ölçütüne ihtiyacınız varsa, güncelleme alanlarını ve ölçüt değerlerini verirsiniz. En iyi filtre kriterleri PK'dir. – Gocht

cevap

26

iki update_or_create() için bölümden oluşur. Anahtar kelimeler güncellenecek nesneyi filtreler, varsayılanlar güncellenen değerlerdir. Filtreler için bir eşleşme yoksa, yeni bir nesne oluşturulur.

Şu anda hepsi anahtar kelime argümanları olarak sağlanan konum beri, bu değerlerin tümü üzerinde filtreledikleri:

upc = upc, 
product_title = product_title, 
is_buyable = is_buyable, 
price = price, 
image_url = image_url, 
breadcrumb = breadcrumb, 
product_url = product_url 

IntegrityErrorupc için belirli bir değer, bir nesne eşleştirme var olsa bile, yani Bu filtrelerin tümü mevcut değil. Django daha sonra bunun yerine nesneyi oluşturmaya çalışır, ancak upc benzersiz değildir, bu nedenle IntegrityError neden olur. Varolan bir nesne ya bulduk ve güncellenmiş veya yeni bir nesne oluşturulur, ancak upc değeri eşsizdir: Sadece upc üzerinde filtrelerseniz

o alan bir IntegrityError çıkarılmasına neden asla.

Yani bu düzeltmek için, basitçe yapın:

obj, created = sfs_upcs.objects.update_or_create(
    # filter on the unique value of `upc` 
    upc=upc, 
    # update these fields, or create a new object with these values 
    defaults={ 
     'product_title': product_title, 'is_buyable': is_buyable, 'price': price, 
     'image_url': image_url, 'breadcrumb': breadcrumb, 'product_url': product_url, 
    } 
) 
+6

Mmm Bunu belgelerden anlamadım. O muydu ya da açık değil mi? – villancikos

+1

@villancikos kesinlikle net değil! Ben de bu çözümle anladım, teşekkürler! – Linucs

+0

@Linucs [açmak bilet] (https://code.djangoproject.com/newticket) çekinmeyin böylece dokümantasyon daha net hale getirilebilir. – knbk