2015-07-14 12 views
9

Tôi đang sử dụng mô hình sau đây trong Django:Update_or_create sẽ không tôn trọng độc đáo chính

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) 

Và sau đó tôi đang sử dụng đoạn mã sau vào views.py tôi:

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 

Tôi bằng cách sử dụng phương thức update_or_create có trong tài liệu https://docs.djangoproject.com/en/1.8/ref/models/querysets/#update-or-create và nói rằng bằng cách chuyển sang từ điển 'mặc định' các giá trị mà bạn muốn UPDATE trong trường hợp đối tượng tồn tại sẽ làm cho thủ thuật ... nhưng tôi tiếp tục nhận được một "IntegrityError tại ... cột upc không phải là duy nhất "...

Bất kỳ ý tưởng nào?

+0

Cho tham số ID. – Gocht

+0

Ý của bạn là gì? Khóa chính? Nhưng, điều đó sẽ làm việc một mình, cứng nhắc? – villancikos

+0

Với 'update_or_create' bạn cần tiêu chí lọc, bạn cung cấp cho các trường cập nhật và các giá trị tiêu chí. Tiêu chí lọc tốt nhất là PK. – Gocht

Trả lời

26

Có hai phần để update_or_create(): giá trị bộ lọc để chọn đối tượng và giá trị cập nhật thực sự được cập nhật. Các từ khóa lọc đối tượng để cập nhật, các giá trị mặc định là các giá trị được cập nhật. Nếu không có kết quả phù hợp cho các bộ lọc, một đối tượng mới sẽ được tạo.

Ngay bây giờ bạn đang lọc trên tất cả các giá trị, vì tất cả chúng được cung cấp như các đối số từ khóa:

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

Các IntegrityError có nghĩa là, mặc dù rằng giá trị cụ thể cho upc tồn tại, một phù hợp đối tượng tất cả các bộ lọc này không tồn tại. Django sau đó cố gắng tạo đối tượng thay thế, nhưng upc không phải là duy nhất, do đó, điều này gây ra một IntegrityError.

Nếu bạn lọc trên chỉ là upc, lĩnh vực đó sẽ không bao giờ gây ra một IntegrityError được nâng lên: hoặc một đối tượng hiện được tìm thấy và được cập nhật, hoặc một đối tượng mới được tạo ra, nhưng giá trị cho upc là duy nhất.

Vì vậy, để khắc phục điều này, bạn chỉ cần làm:

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 Tôi không hiểu điều đó từ tài liệu. Có phải là tôi hay chỉ là không rõ ràng? – villancikos

+1

@villancikos nó hoàn toàn không rõ ràng! Tôi cũng đã tìm ra giải pháp này để cảm ơn! – Linucs

+0

@Linucs Hãy thoải mái [mở một vé] (https://code.djangoproject.com/newticket) để tài liệu có thể được làm rõ hơn. – knbk

Các vấn đề liên quan