django - 从模型中重置多对多字段
问题描述
我想用 django-orm 重置我所有帖子中的所有赞成票,不知道如何为此编写查询并将其应用于视图。此外,也许制作单独的 upvote 模型而不是 Post 中的一个字段会更好。
class Post(models.Model):
author = models.ForeignKey(
User,
related_name='posts',
on_delete=models.SET_NULL,
null=True
)
title = models.CharField(max_length=100)
creation_date = models.DateTimeField(auto_now_add=True)
link = models.URLField()
upvotes = models.ManyToManyField(User, related_name='upvotes', blank=True)
解决方案
我想重置我所有
Post
的投票
您可以这样做,例如:
Post.upvotes.through.objects.all().delete()
例如,您可以在数据迁移[Django-doc]中执行此操作。
这将清除多对多表中的记录。
此外,也许制作单独的 upvote 模型而不是 Post 中的一个字段会更好。
AManyToManyField
并不是真正的“字段”,它被存储为模型。您可以定义through=…
模型 [Django-doc],例如:
from django.conf import settings
class Post(models.Model):
author = models.ForeignKey(
settings.AUTH_USER_MODEL,
related_name='posts',
on_delete=models.SET_NULL,
null=True
)
title = models.CharField(max_length=100)
creation_date = models.DateTimeField(auto_now_add=True)
link = models.URLField()
upvotes = models.ManyToManyField(
settings.AUTH_USER_MODEL,
related_name='liked_posts',
editable=False,
through='Upvote'
)
class Upvote(models.Model):
user = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE
)
post = models.ForeignKey(
'Post',
on_delete=models.CASCADE
)
注意:通常使用
settings.AUTH_USER_MODEL
[Django-doc]引用用户模型比直接使用User
模型 [Django-doc]更好。有关更多信息,您可以查看文档的引用User
模型部分。
推荐阅读
- ansible - 仅当任务之前未运行或版本更改时才以 ansible 角色运行任务
- powershell - 在具有特定修改日期的文件中搜索单词
- c# - 在 lerp 动画结束之前调用 Unity awaitForSeconds
- authentication - Apache2 忽略“授权结果
:拒绝(还没有经过身份验证的用户)”并让随机用户登录 - json - Conda 存储库中“已删除”部分的含义是什么
- javascript - 如何在数据表中使用 onmouseover 显示图形
- c# - System.UnauthorizedAccessException: '访问路径'c:\Documents and Settings' 被拒绝。' C#
- java - 无法在 Spock 中断言值
- python - 如果我在for循环中使用while循环,while循环不应该根据for循环的范围重复吗?
- excel - 停止更新引用工作表的公式,直到我运行完宏