django - 在 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})
但它没有更新该字段。
解决方案
您可以对模型执行.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_id
and的对象已经存在,它将在此处进行查询group_id
。如果不是,它将构造一个,其中is_active
和is_featured
这里的值True
(在 中指定defaults
)。如果Membership
对象已经存在,那么它将同时更新is_active
和is_featured
到True
。
推荐阅读
- vb.net - 查询特定时期
- javascript - Javascript过滤空值或函数修复的最佳方法
- amazon-web-services - 当我使用作业胶水时,Amazon S3 中的数据是否会在公共互联网上传输?
- python - 使用 python magic 进行文件验证的问题
- arrays - 地址簿 / 数组,无法工作 / Jaca 脚本
- pandas - 使用 openpyxl 时写入 excel 的 Pandas 会发出警告
- python - Plotly:如何使用 For 循环为数据框中的每个变量创建散点图?
- java - Java CloseableHttpClient 中的标头排序
- python - 在 Flask 应用程序中运行时函数不会返回元组/列表
- javascript - 加载或刷新 Ionic 应用程序时出错,但在导航回该应用程序时有效