繁体   English   中英

使(和测试)2 个字段在 Django 模型中是唯一的

[英]Make (& test) 2 fields unique in Django Model

我有一个模型 UserSite。 每个用户可以有多个站点。 我现在必须让它们独一无二。 因此,如果站点已被指定给该用户,则该站点不能添加到该用户。 我的模型代码是:

class UserSite(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="sites")
    site = models.ForeignKey(Site, on_delete=models.CASCADE, related_name="users")

    class Meta:
        unique_together = ("user", "site")

一切都很好。 现在我想创建一个测试类来测试这是否有效。 我的测试班:

从 rest_framework.test 导入 APITestCase

from models import UserSite
from factories import SiteFactory
from factories import UserFactory


class TestUniqueUserSite(APITestCase):
    def setUp(self):
        self.user = UserFactory()
        self.test_site = SiteFactory()
        self.test_site_2 = SiteFactory()

        self.user_site = UserSite.objects.create(user=self.user, site=self.test_site)

    def test_user_site_is_unique(self):
        """
        Check if a new UserSite is unique
        """
        self.user_site1 = UserSite.objects.create(user=self.user, site=self.test_site)

工厂:

class UserSiteFactory(factory.django.DjangoModelFactory):
    class Meta:
        model = UserSite

    # Type hinting
    def __new__(cls, *args, **kwargs) -> "UserSiteFactory.Meta.model":
        return super().__new__(*args, **kwargs)  # pragma: no cover

    site = factory.SubFactory(SiteFactory)
    user = factory.SubFactory(UserFactory)
    user_role = factory.fuzzy.FuzzyChoice(UserSite.USER_ROLE_CHOICES)

这个测试没有错误,可以创建 UserSite。 我怎么了? 测试还是独特的领域? 或者两者都呵呵,谢谢!

当我运行时:

UserSite.objects.filter(user=self.user, site=self.test_site).all()

我有:

<QuerySet [<UserSite: pk: 1 - user_pk: 1 - site_pk: 1>, <UserSite: pk: 2 - user_pk: 1 - site_pk: 1>]>

所以他们被存储..

我的猜测是 unique_constraint 应该是一个列表,而不是一个元组。

您没有正确设置约束,应该像

class UserSite(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="sites")
    site = models.ForeignKey(Site, on_delete=models.CASCADE, related_name="users")

    class Meta:
        unique_together = (("user", "site"),)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM