【问题标题】:"unique = True" - Django models - Unique for each user not unique for all data submitted by everyone“unique = True” - Django 模型 - 每个用户的唯一性不是每个人提交的所有数据都是唯一的
【发布时间】:2022-01-24 21:54:51
【问题描述】:

我目前在 Django 中有一个模型,并且我创建了一个字段unique=True,这样就不会将重复项提交到数据库。我的问题是它扩展到所有用户。我的意思是用户 1 应该能够提交“Example1”和“Example2”,并且永远不能提交“Example1”或“Example2”,然后 User2 应该出现并且也能够提交“Example1”和“Example2”,但他们不能因为用户1 已经提交了。
有没有一种方法可以让我获得某种程度的unique=True,但对于每个用户来说都是分开的,而不是像现在这样结合起来。

提前致谢。代码如下。

问题出在type =,我的用户也是由 ForeignKey 定义的。

class Field_Repo1(models.Model):
    user = models.ForeignKey(User, default=True, related_name="Field_Repo1", on_delete=models.PROTECT)
    title = models.CharField(max_length=20, verbose_name='Title of Field')
    type = models.CharField(max_length=200, blank=True, unique=True, null=True, verbose_name='Field')

    class Meta:
        ordering = ['-type']

    def __str__(self):
        return str(self.user) or 'NONE'

    def get_absolute_url(self):
        return reverse('repo1')

更新的有效代码

class Field_Repo1(models.Model):
user = models.ForeignKey(User, default=True, related_name="Field_Repo1", on_delete=models.PROTECT)
title = models.CharField(max_length=20, verbose_name='Title of Field')
type = models.CharField(max_length=22, choices=FIELDS, verbose_name='Field')

class Meta:
    ordering = ['-type']
    constraints = [
        models.UniqueConstraint(fields=['user', 'type'], name='unique type for each user')
    ]

def __str__(self):
    return str(self.user) or 'NONE'

def get_absolute_url(self):
    return reverse('repo1')

【问题讨论】:

  • 如果 user1 创建了 example1 那么 user2 也可以创建 example1 但 user2 不能再次创建 example1?那是你要的吗?每个用户都应该只有自己的唯一标题?
  • unique_together 元选项...?
  • @Mirza715 该链接有点帮助,我不知道我是如何在研究中没有偶然发现它的,但它以一种截然不同的方式定义用户,我已经围绕一个不同的定义方式,并且只能将该方法用作最后的努力。不过谢谢。
  • @MojixCoder 是的,这正是我正在寻找的。对不起,我很难措辞。

标签: django unique web-deployment


【解决方案1】:

你需要使用UniqueConstraint:

class Field_Repo1(models.Model):
    user = models.ForeignKey(User, default=True, related_name="Field_Repo1", on_delete=models.PROTECT)
    title = models.CharField(max_length=20, verbose_name='Title of Field')
    type = models.CharField(max_length=200, blank=True, unique=True, null=True, verbose_name='Field')

    def __str__(self):
        return str(self.user) or 'NONE'

    def get_absolute_url(self):
        return reverse('repo1')

    class Meta:
        ordering = ['-type']
        constraints = [
            models.UniqueConstraint(fields=['user', 'title'], name='unique title for each user')
        ]

【讨论】:

  • 我尝试了这个确切的示例,但将 UniqueContraint 中的“标题”切换为“类型”,因为这是我试图为每个用户分别设置唯一的字段。它没有用,我尝试了一些不同的方法,但没有异常特征,它只是给出了错误“Field_ repo1 with this Field already exists”。那是在运行 makemigrations 和 migrate 之后。没有失败,但没有新的事情发生。
  • 我很抱歉。这确实有效。这个概念确实有效,但对于最终测试,我的模型有点不同。我正在从下拉列表中运行类型,这改变了一些事情。我的模型中还有两个 Meta,一个用于订购,一个用于 UniqueContraint,因此也改变了一些东西。我将更新上面原始帖子中的最终代码。
猜你喜欢
  • 1970-01-01
  • 2020-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-25
相关资源
最近更新 更多