首页 > 解决方案 > 从模型中重置多对多字段

问题描述

我想用 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)

标签: djangodjango-orm

解决方案


我想重置我所有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模型部分


推荐阅读