2011-08-17 32 views
6

bạn có thể giúp tôi hiểu tại sao mã này gây ra một mục trùng lặp (IntegrityError)?Django - get_or_create không hoạt động

Tôi đang ở trên Django 1.2.

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

Tôi có một ràng buộc duy nhất trên trường1. Nếu có một hàng mà field1 = 1, mọi thứ hoạt động tốt, Django sẽ thực hiện "get".

Nếu không có hàng có field1 = 1, có vẻ như Django đang tạo hàng đó là ok. Nhưng tại sao nó không cho phép tôi cứu nó?

Cập nhật:

Nếu nó giúp, đây là MyModel:

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 là khóa ngoại đến bảng khác. Nhưng tôi đã không làm một mô hình ở Django cho bảng đó vì vậy tôi không nói với Django đó là một khóa ngoại.

+0

Liệu MyModel có trường nước ngoài? Bạn có thể đăng mã MyModel không? –

+1

[Câu hỏi tương tự này] (http://stackoverflow.com/questions/6974463/django-get-or-create-raises-duplicate-entry-with-together-unique) có thể giúp bạn. – agf

+0

@agf. Tôi không hiểu độ phân giải của câu hỏi đó là gì, hoặc vấn đề được biện minh như thế nào. Nghe có vẻ như là một lỗi đối với tôi. Tôi nghĩ tôi sẽ từ bỏ get_or_create và làm một công việc xung quanh :-( – Greg

Trả lời

3

âm thanh get_or_create bị vỡ với tôi. Tôi chỉ thực hiện công việc này xung quanh:

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

Giả sử đó là một biểu tượng hợp lý trung thực về mã thực của bạn, không ngạc nhiên khi đó không phải là Django, đó là mô hình của bạn.

Bạn đã ghi đè trường khóa chính tự động bằng trường id của riêng bạn, nhưng bị bỏ quên để biến nó thành tự động. Vì vậy, cơ sở dữ liệu không sử dụng một giá trị mới cho PK, do đó lỗi toàn vẹn.

Trừ khi bạn có lý do thực sự tốt, bạn nên để Django đối phó với chính trường PK.

+1

Ồ, đó là một điểm tốt. Đó là một bảng hiện có mà tôi không thể thay đổi. tại sao tôi nói với Django những gì khóa chính là.Vì vậy, những gì tôi thay đổi chính xác? Các cột "id" trong bảng MySQL thực sự được thiết lập để tự động tăng.Đó tôi cần phải nói với Django nó là một lĩnh vực tự động tăng? – Greg

+0

@Greg, Bạn đã thử điều này chưa? – Kirill

1

Nhận hoặc Tạo trả về một bộ kết quả ngay cả khi trường bạn sử dụng được đặt làm khóa chính hoặc duy nhất.

Vì vậy, trong trường hợp của bạn: hàng là một tuple với một đối tượng, do đó điều này sẽ làm việc cho bạn:

(row, is_new) = MyModel.objects.get_or_create(field1=1) 
row[0].other_field = 2 
row[0].save() 
Các vấn đề liên quan