我如何使 django 模型字段独一无二,但仅适用于单个用户?

How do i go about making a django model field unique but only for individual users?

提问人:Saif eldeen Adel 提问时间:2/11/2021 更新时间:2/11/2021 访问量:699

问:

所以我有这个监视列表模型

class Watchlist(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='watchlist')
    symbol = CharField(max_length=10, unique=True)

保存用户和文本符号的位置。不允许用户保存两个相同的符号,因为这不是好的逻辑。这就是为什么我添加了.但是,我后来意识到我有点误解了 unique 的作用,无论用户是谁,它在整个表格中都是唯一的。unique=True

我只希望它在用户相同时是唯一的。

所以Test_User可以保存“ABC”和“DEF”,但不能再次保存“ABC”。 但是,应允许 User123 保存“ABC”,依此类推。

一个糟糕的解决方案是,当我保存实例时,通过获取已保存的符号列表并检查给定的符号是否在该列表中并相应地保存来保存实例时,在我的视图中处理它。我认为这是一个糟糕的解决方案,因为它在管理中不起作用,如果我需要在其他视图中使用它,冗余将是疯狂的

Django Django-模型

评论


答:

0赞 Vishal Singh 2/11/2021 #1

你可以使用 UniqueConstraint[Django-Docs] 来限制用户不再使用相同的符号。

from django.db import models

class Watchlist(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="watchlist")
    symbol = CharField(max_length=10, unique=True)

    class Meta:
        constraints = [
            models.UniqueConstraint(fields=["user", "symbol"], name="user_symbol")
        ]

评论

0赞 Saif eldeen Adel 2/11/2021
看起来它也可以工作,但我可能更喜欢使用 Amen 所说的 unique-together。无论如何,谢谢
0赞 Vishal Singh 2/11/2021
你现在可以使用,但请记住,将来可能会被弃用,如 Django 文档中所述。unique_togetherunique_together
2赞 Armen Tsaturyan 2/11/2021 #2

在 Meta 类中unique_together字段用于模型。例如:

class Watchlist(models.Model):
   user = models.ForeignKey(User, on_delete=models.CASCADE, 
                            related_name='watchlist')
   symbol = CharField(max_length=10)
   
   class Meta:
      unique_together = 'user', 'symbol'

同时链接到 Django 文档:https://docs.djangoproject.com/en/3.1/ref/models/options/#unique-together