Поле ManyToMany возвращает None в модульном тесте - PullRequest
1 голос
/ 27 января 2020

Поскольку я готовлю свой тест к некоторым моделям, содержащим поле ManyToMany, я проверяю, добавляются ли в поле связанные экземпляры моделей. Однако при доступе к полю ManyToMany для каждой модели я получаю следующее ...

menu.Item.None
menu.Ingredient.None

Что вызывает возврат None и что можно сделать, чтобы увидеть связанные объекты для каждой соответствующей Поле ManyToMany?

tests.py

class TestForm(TestCase):

    @classmethod
    def setUpTestData(cls):
        test_chef = User.objects.create_user("test_chef")
        eggs = Ingredient.objects.create(name="Eggs")
        flour = Ingredient.objects.create(name="Flour")
        milk = Ingredient.objects.create(name="Milk")
        butter = Ingredient.objects.create(name="Butter")
        vanilla_extract = Ingredient.objects.create(name="Vanilla Extract")
        sugar = Ingredient.objects.create(name="Sugar")
        cls.item = Item.objects.create(
            name="Crepe",
            description="A thin pancake orginiating from France",
            chef=test_chef,
            created_date=timezone.now(),
            standard=True
        )
        cls.item.ingredients.add(eggs, flour, milk, butter, vanilla_extract, sugar,)
        cls.menu = Menu.objects.create(
            season="Fall"
        )
        cls.menu.items.add(cls.item)

    def test_form(self):
        print(self.menu.items)
        print(self.item.ingredients)

models.py

class Menu(models.Model):
    season = models.CharField(
        max_length=20,
        unique=True
    )
    items = models.ManyToManyField('Item', related_name='items')
    created_date = models.DateTimeField(
            default=timezone.now)
    expiration_date = models.DateTimeField(
            blank=True, null=True)

    def __str__(self):
        return self.season

class Item(models.Model):
    name = models.CharField(max_length=200, unique=True)
    description = models.TextField()
    chef = models.ForeignKey('auth.User', on_delete=models.CASCADE)
    created_date = models.DateTimeField(
            default=timezone.now)
    standard = models.BooleanField(default=False)
    ingredients = models.ManyToManyField('Ingredient')

    def __str__(self):
        return self.name

class Ingredient(models.Model):
    name = models.CharField(max_length=200, unique=True)

    def __str__(self):
        return self.name

1 Ответ

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

Вам нужно добавить вызов метода, например .all(), в конце, иначе он действительно печатается как <i>ModelName</i>.None. Причина этого заключается в том, что self.menu.items является менеджером , а не набором запросов. Это сравнимо с MyModel.objects, не дающим никаких элементов.

Таким образом, вы добавляете:

def test_form(self):
    print(self.menu.items<b>.all()</b>)
    print(self.item.ingredients<b>.all()</b>)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...