Django многие ко многим не работают в unittest, но работают в админке

У меня есть две модели, связанные через поле "многие ко многим".

class Tires(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    brand = models.CharField(max_length=50)

class Car(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    brand = models.CharField(max_length=50)
    tires = models.ManyToManyField('Tires', blank=True)

Он отлично работает, когда я добавляю шины в машину через страницу администратора, но он не работает в моих тестах, и я не могу понять, в чем проблема (возможно, что-то действительно простое)

Это мой юнит-тест:

def test_many_to_many(self):
    tires_1 = Tires(brand='bridgestone')
    tires_1.save()
    car_1 = Car(brand='BMW')
    car_1.save()
    car_1.tires.add(tires_1)
    car_1.save()

Это не вызывает никаких исключений, но когда я печатаю car_1.tires, он говорит carthings.Tires.None, я пробовал это наоборот, добавляя car_1 к tyres_1.car_set, но это дает тот же результат. Я также попытался добавить объект другого класса в поле "многие ко многим", просто чтобы посмотреть, что произойдет, что приведет к ошибке. Похоже, что добавление работает, но оно не сохраняется или что-то еще?

1 ответ

Решение

Вы, вероятно, делаете это:

>> print car_1.tires
carthings.tires.None

Который является представлением "менеджера связанных объектов". Вы, вероятно, хотите сделать что-то вроде:

>> print car_1.tires.all()
[<Tire 1>]

Который возвращает набор запросов, и его представление является более значимым, поскольку он фактически выполняет запрос, чтобы показать первые элементы в отношении.

Кстати, вам не нужно save модель после добавления чего-либо в отношения шин, так как вам не нужно обновлять таблицу автомобилей.

Другие вопросы по тегам