gpt4 book ai didi

python - 为什么不能在 Django ManyToMany 字段上强制执行唯一性?

转载 作者:行者123 更新时间:2023-12-04 02:19:15 24 4
gpt4 key购买 nike

我正在为我的网站创建一个简单的二元评级系统,它是一个学习 Material 网站,其摘要可以被评为 +1 或 -1。

我已经在我的摘要模型和用户模型之间定义了 ManyToMany 字段,如下所示:

users_rated_positive = models.ManyToManyField(
User, blank=True, related_name='summaries_rated_positive')
users_rated_negative = models.ManyToManyField(
User, blank=True, related_name='summaries_rated_negative')

但是很明显,给定的用户不能对给定的摘要进行多次评分。

我尝试设置 unique=True 但 Django 似乎不允许我这样做。

是否有更好的方式来存储更符合我的意图的评分?

最佳答案

考虑使用 ManyToMany through table .

class Summary(models.Model):
user_ratings = models.ManyToManyField(
'User', blank=True, through='UserRating',
)


class UserRating(models.Model):
user = models.ForeignKey('User')
summary = models.ForeignKey('Summary')
is_positive = models.BooleanField()

class Meta:
unique_together = ('user', 'summary')

然后你可以用类似的东西来查询那些积极评价摘要的用户

summary.user_ratings.filter(is_positive=True)
summary.user_ratings.filter(is_positive=False)

unique_together 属性确保用户无法查看同一个摘要两次。

您甚至可以使用自定义查询集保留相似的语法。下面是对它可能是什么样子的猜测:

class SummaryQuerySet(models.QuerySet):

def users_rated_negative(self):
return self.user_ratings.filter(is_positive=False)

def users_rated_positive(self):
return self.user_ratings.filter(is_positive=True)


class Summary(models.Model):
user_ratings = models.ManyToManyField(
'User', blank=True, through='UserRating',
)

objects = SummaryQuerySet.as_manager()

现在使用的语法是 summary.users_rated_positive

User 的类似自定义查询集将为您提供 summaries_rated_positive 属性,如果您也需要的话。

关于python - 为什么不能在 Django ManyToMany 字段上强制执行唯一性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32199659/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com