在Django many-to-many-through模型中创建或更新字段



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

这是我的型号。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

我该怎么做?我可以通过过滤Membership表和更新字段来做到这一点,但我想这不是一个好的做法。我想用更好的解决方案。

我试过使用同一条

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

但是它没有更新该字段。

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

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

因此,在这里,它将进行一个查询,查找给定person_idgroup_id是否已经存在Membership对象。如果没有,它将构造一个,其中is_activeis_featured的值为True(如defaults中指定的(。如果Membership对象已经存在,则它将is_activeis_featured都更新为True

相关内容

  • 没有找到相关文章

最新更新