Сделайте (и протестируйте) 2 поля уникальными в Django Model - PullRequest
0 голосов
/ 30 января 2020

У меня есть модель 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 import 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.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>]>

Так они и хранятся ..

Ответы [ 2 ]

0 голосов
/ 31 января 2020

Вы не устанавливаете ограничение правильно, оно должно быть как

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"),)
0 голосов
/ 30 января 2020

Я предполагаю, что unique_constraint должен быть списком, а не кортежем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...