【问题标题】:Django get_or_create, how to say commit=FalseDjango get_or_create,怎么说commit=False
【发布时间】:2012-11-29 02:14:54
【问题描述】:

假设我有这个模型:

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)

如果我这样做:

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

我不想在过滤条件中包含 added_by 字段。我想稍后保存added_by 字段。像commit=False 这样告诉 Django 我计划稍后添加更多字段:

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

我知道还有其他选择,例如我可以使用ObjectDoesNotExist。但是有什么方法可以在get_or_create 中实现所需的功能吗?

我要排除 added_by 字段的原因可能是另一个用户已经添加了另一个用户配置文件。

【问题讨论】:

  • 将 commit=False 添加到 get_or_create 是个好主意。也许您可能想在 django-developers 邮件列表中提出建议。

标签: python django


【解决方案1】:

您可以将defaults 参数传递给get_or_create 来为未在过滤中使用的新创建对象填充此数据:

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

【讨论】:

    猜你喜欢
    • 2018-05-12
    • 2012-10-02
    • 1970-01-01
    • 1970-01-01
    • 2010-11-02
    • 2015-06-09
    • 1970-01-01
    • 1970-01-01
    • 2018-09-24
    相关资源
    最近更新 更多