首页 > 解决方案 > 在 Django 多对多模型中创建或更新字段

问题描述

我想通过模型字段在 mm 中创建_or_update

这是我的models.py

from django.db import models

class Person(models.Model):
    name = models.CharField(max_length=128)

    def __str__(self):
        return self.name

class Group(models.Model):
    name = models.CharField(max_length=128)
    members = models.ManyToManyField(Person, through='Membership')

    def __str__(self):
        return self.name

class Membership(models.Model):
    person = models.ForeignKey(Person, on_delete=models.CASCADE)
    group = models.ForeignKey(Group, on_delete=models.CASCADE)
    is_featured = models.BooleanField(default=False)
    is_active = models.BooleanField(default=False)

在我看来.py 下面的代码工作得很好

person_obj = Person.objects.get(id=1)
group_obj = Group.objects.get(id=1)
group_obj.add(person_obj, through_defaults={'is_featured': False, 'is_active': True})

现在对于相同的 group_obj 和 person_obj 我想is_featured = True在会员模型中更新。

我怎样才能做到这一点?我可以通过过滤会员表和更新字段来做到这一点,但我想这不是一个好习惯。我想通过更好的解决方案来做到这一点。

我试过同一行

group_obj.member.add(person_obj, through_defaults={'is_featured': True, 'is_active': True})

但它没有更新该字段。

标签: djangodjango-rest-frameworkdjango-related-manager

解决方案


您可以对模型执行.update_or_create(..)调用 [Django-doc]Membership

Membership.objects.update_or_create(
    person_id=person_id,
    group_id=group_id,
    defaults={'is_active': True, 'is_featured': True}
)

Membership因此,如果给定person_idand的对象已经存在,它将在此处进行查询group_id。如果不是,它将构造一个,其中is_activeis_featured这里的值True(在 中指定defaults)。如果Membership对象已经存在,那么它将同时更新is_activeis_featuredTrue


推荐阅读