2012-11-28 26 views
7

Giả sử tôi có mô hình này:Django get_or_create, làm thế nào để nói cam kết = False

class SocialGroupMembers(models.Model): 
    social_group = models.ForeignKey(SocialGroup, related_name="members") 
    profile = models.ForeignKey(Profile) 
    date_joined = models.DateTimeField(auto_now_add=True) 
    added_by = models.ForeignKey(User) 
    approved = models.BooleanField(default=False) 

Nếu tôi làm:

obj, created = SocialGroupMembers.objects.get_or_create(
     social_group=social_group, profile=profile) 
    # this will give integrity error that added_by can not be null 

Tôi không muốn bao gồm added_by trường trong tiêu chí lọc. Tôi muốn lưu lại trường added_by sau. Một cái gì đó như commit=False để nói với Django rằng tôi có kế hoạch thêm nhiều trường hơn sau:

obj, created = SocialGroupMembers.objects.get_or_create(commit=False, 
     social_group=social_group, profile=profile) 
if created: 
    obj.added_by = request.user 
    obj.save() 
else: 
    #do something 

Tôi biết có các lựa chọn thay thế, ví dụ: Tôi có thể sử dụng ObjectDoesNotExist. Nhưng có cách nào để đạt được chức năng mong muốn trong get_or_create không?

Lý do tôi muốn loại trừ trường added_by là do có thể người dùng khác đã thêm một hồ sơ người dùng khác.

+2

Thêm cam kết = False để get_or_create là một tốt ý kiến. Có lẽ bạn có thể thích đề xuất trên danh sách gửi thư django-developers. – s29

Trả lời

9

Có một cuộc tranh luận defaults bạn có thể vượt qua để get_or_create để cư dữ liệu này cho các đối tượng mới được tạo ra mà không được sử dụng trong việc lọc:

defaults = {'added_by': request.user} 
obj, created = SocialGroupMembers.objects.get_or_create(
     social_group=social_group, profile=profile, defaults=defaults) 

https://docs.djangoproject.com/en/1.4/ref/models/querysets/#get-or-create

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