Как написать тестовый пример для модели Django, у которой все поля являются foreignkey в DRF?
У меня есть модель, все поля которой являются внешними ключами для других моделей. Как мы можем создать тестовый пример в Django rest framework в таком случае?
У меня есть следующая модель:
class Example(models.Model):
package = models.ForeignKey(
Destination, related_name="packages", on_delete=models.CASCADE
)
user = models.ForeignKey(
User,
on_delete=models.CASCADE,
null=True,
related_name="user_packages",
)
tour = models.ForeignKey(
Tours,
on_delete=models.CASCADE,
null=True,
related_name="tour_packages",
)
В модели Django, когда есть только одно поле, это можно сделать следующим образом:
class NewsLetter(models.Model):
NewsLetterID = models.AutoField(primary_key=True)
Email = models.CharField(max_length=255)
Connected = models.BooleanField(default=False)
UserID = models.ForeignKey(User, on_delete=models.CASCADE)
class Meta:
db_table = 'NewsLetter'
@classmethod
def setUpTestData(cls):
#Set up non-modified objects used by all test methods
user = User.objects.create(<fill params here>)
NewsLetter.objects.create(NewsLetterID=1, Email='test@test.com', Connected=False,UserID=user)
Так что даже если я создал все объекты для всех полей с иностранными ключами, как в этом примере, дело в том, что для моделей связанных полей, они сами имеют поля с иностранными ключами. Как мы можем к этому подойти? Например, в моей модели Example модель Destination сама связана с другими полями с внешним ключом. Как же создать модульный тест для создания api для этой модели примера?
Я думаю, что вы подходите к этому правильно: Вы должны установить все необходимые тестовые экземпляры в правильном порядке и связать их соответствующим образом.
Чтобы сделать это менее громоздким и более читаемым, вы можете использовать проект типа factory_boy для генерации фабрик приспособлений. Тогда ваша установка может выглядеть примерно так:
import factory
# Define your factories
class PackageFactory(factory.django.DjangoModelFactory):
class Meta:
model = 'yourapp.Package'
class UserFactory(factory.django.DjangoModelFactory):
class Meta:
model = 'yourapp.User'
class TourFactory(factory.django.DjangoModelFactory):
class Meta:
model = 'yourapp.Tour'
class ExampleFactory(factory.django.DjangoModelFactory):
package = factory.SubFactory(PackageFactory)
user = factory.SubFactory(UserFactory)
tour = factory.TourFactory(TourFactory)
class Meta:
model = 'yourapp.Example'
# And now, create a new example instance together with all related models:
example = ExampleFactory()