Как создать запись, содержащую пользователя в Django тестовом наборе - PullRequest
2 голосов
/ 30 мая 2020

У меня есть эта модель в моем Django приложении:

class ClubSession(models.Model):
    location = models.CharField(max_length=200)
    coach = models.ForeignKey('auth.User', on_delete=models.CASCADE)
    date = models.DateTimeField(default=now)
    details = models.TextField()

    def __str__(self):
        return self.location

Это представление реализует его:

class SessionListView(ListView):
    model = ClubSession
    template_name = 'club_sessions.html'
    context_object_name = 'all_club_sessions_list'

Я пытаюсь протестировать представление. В моем тестовом классе есть setUp, который создает запись:

def setUp(self):
    ClubSession.objects.create(location='test location',
                               coach=User(id=1),
                               date='2020-06-01 18:30',
                               details='this is another test')

Когда я запускаю свой тест, я получаю эту ошибку:

IntegrityError: The row in table 'club_sessions_clubsession' with primary key '1' has an invalid foreign key: club_sessions_clubsession.coach_id contains a value '1' that does not have a corresponding value in auth_user.id.

Пользователь с идентификатором 1 существует, так как Я заставлю это работать? Я пробовал добавить имя пользователя, но это тоже не сработало.

1 Ответ

2 голосов
/ 30 мая 2020

Я настоятельно рекомендую не использовать первичные ключи, тем более что за отправку первичных ключей отвечает база данных, и, следовательно, это может отличаться в зависимости от сеанса.

* 1004 независимая база данных, поэтому данные, хранящиеся в базе данных, которую вы используете в разработке или производстве, не используются.

Вероятно, лучше сначала создать пользователя, например:

from django.contrib.auth.models import User

# …

def setUp(self):
    user = User.objects.<b>create(</b>username='foo'<b>)</b>
    ClubSession.objects.create(
        location='test location',
        coach=<b>user</b>,
        date='2020-06-01 18:30',
        details='this is another test'
    )
...