我想通过模型字段在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_id
和group_id
是否已经存在Membership
对象。如果没有,它将构造一个,其中is_active
和is_featured
的值为True
(如defaults
中指定的(。如果Membership
对象已经存在,则它将将is_active
和is_featured
都更新为True
。