[英]Make (& test) 2 fields unique in Django Model
I have a model UserSite.我有一个模型 UserSite。 Every User could have multiple sites.
每个用户可以有多个站点。 I now have to make them unique.
我现在必须让它们独一无二。 So a site can't be added to a user if it already is appointed to that user.
因此,如果站点已被指定给该用户,则该站点不能添加到该用户。 My Model code is:
我的模型代码是:
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")
All fine.一切都很好。 Now I want to make a test class who tests if this works.
现在我想创建一个测试类来测试这是否有效。 My test class:
我的测试班:
from rest_framework.test import APITestCase从 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)
Factory:工厂:
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)
This test gives no errors, the UserSite can be created.这个测试没有错误,可以创建 UserSite。 What do I wrong?
我怎么了? The testing or the unique field?
测试还是独特的领域? or both hehe, thanks!
或者两者都呵呵,谢谢!
When I run:当我运行时:
UserSite.objects.filter(user=self.user, site=self.test_site).all()
I got:我有:
<QuerySet [<UserSite: pk: 1 - user_pk: 1 - site_pk: 1>, <UserSite: pk: 2 - user_pk: 1 - site_pk: 1>]>
So they are stored..所以他们被存储..
我的猜测是 unique_constraint 应该是一个列表,而不是一个元组。
You are not setting the constraint correctly, it should be like您没有正确设置约束,应该像
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.