2011-08-07 33 views
26

mô hình ví dụDjango: get_or_create Tăng nhập trùng lặp với together_unique

class Example(Stat): 
    numeric = models.IntegerField(...) 
    date = models.DateField(auto_now_add=True,...) #auto_now_add=True was the problem 

    class Meta: 
     unique_together = ('numeric','date') 

)

Nếu 72 và '2011/08/07' đã được lưu trữ

Example.object.get_or_create(numeric=72,date='2011-08-07') 

tăng

django.db.utils.IntegrityError: (1062, "Duplicate entry '72-2011-08-07' 

câu hỏi là lý do tại sao get_or_create tăng số IntegrityError, đó là ý tưởng sử dụng get_or_create.

Không chắc nếu đây là một lỗi, tôi mở một vé https://code.djangoproject.com/ticket/16587

+0

xin lỗi nếu không rõ ràng câu hỏi. Tôi đã chỉnh sửa câu hỏi, hy vọng là tốt hơn bây giờ – llazzaro

+0

Chỉ là một 'get' đơn giản với cùng một đối số EXACT khi' get_or_create' trả về mục đó? – agf

Trả lời

17

Nó xuất hiện vấn đề của bạn là với đó là nhiều cột bạn không bao gồm trong get_or_create bạn, hãy xem ví dụ this thread trên một mailing list Django.

Bạn cần sử dụng thông số defaults của get_or_create như được mô tả trong docs hoặc chỉ định giá trị cho tất cả các cột, cho get_or_create để khớp chính xác.

+1

Tôi hiểu rằng loại sử dụng tôi sẽ cần mặc định, nhưng params của tôi trong get_or_create là toàn bộ trường avaidable trong lớp. Dù sao thông tin đó đã giúp ích rất nhiều. Ngoài ra nếu tôi loại bỏ unique_together thì get_or_create hoạt động. – llazzaro

+0

'get_or_create' cũng có phân biệt chữ hoa chữ thường - nếu chúng có trường hợp khác nhau, nó sẽ không tìm thấy kết quả phù hợp, nhưng bạn vẫn có thể gặp phải ràng buộc duy nhất. – agf

+2

Tôi đã giải quyết được vấn đề khi đọc câu trả lời của bạn. DateField đã sử dụng auto_now_add = True, vì vậy tôi đã tránh một số thông tin quan trọng trong câu hỏi của mình. Để giải quyết auto_now_add = False hiện đang hoạt động – llazzaro

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