Не удается проверить ссылки «многие ко многим» в Django - PullRequest
0 голосов
/ 20 мая 2019

Я хочу проверить созданную ссылку на м2.В моделях это выглядит так:

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)

    def __str__(self):
        return self.user.username


class List(models.Model):
    name = models.CharField(max_length = 4)
    user = models.ManyToManyField(Profile)

    def __str__(self):
        return f'{self.name} by {self.user.__str__()}'


@receiver(post_save, sender = User)
def create_user_profile(sender, instance, created, **kwargs):
    if created:
        Profile.objects.create(user = instance)


@receiver(post_save, sender = User)
def save_user_profile(sender, instance, **kwargs):
    instance.profile.save()

Мой тест выглядит следующим образом:

def test_create_list(self):
    self.create_user("test_user") # returns User.objects.create_user
    extended_user = Profile.objects.get(pk = 1)
    l = List.objects.create(
        name = "2019"
    )
    l.user.add(extended_user)
    self.assertEqual(l.__str__(), f"2019 by {extended_user.__str__()}")

Это приводит к провалу теста:

Expected :'2019 by hay.Profile.None'
Actual   :'2019 by test_user'

Почему это hay.Profile.None подходит?Я пытался добавить l.save() до подтверждения, но это не помогает.Что я могу сделать?

1 Ответ

2 голосов
/ 20 мая 2019

У вас есть отношение многие ко многим.Это означает, что, как следует из названия, много предметов на каждой стороне.Вы не можете просто сказать self.user;это аксессор для многих пользователей, связанных с self.Вам нужно опросить всех этих пользователей, а затем сделать что-то, чтобы отформатировать их для подходящей строки;например, соединяя их запятыми.

Обратите внимание, что вы никогда не должны вызывать методы двойного подчеркивания напрямую.Используйте встроенную функцию, например, str(whatever).Итак:

def __str__(self):
    return f'{self.name} by {', '.join(str(user) for user in self.user.all())}'

и

self.assertEqual(str(l), f"2019 by {str(extended_user)}")

, но для правильной проверки вам, вероятно, следует создать несколько связанных профилей для списка.

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