Django 多对多在 unittest 中不起作用,但在 admin 中起作用

Django many to many doesn't work in unittest but works in admin

我有两个通过多对多字段关联的模型。

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 添加到 tires_1.car_set,但结果相同。我还尝试在多对多字段中添加一个不同 class 的对象,只是为了看看会发生什么,这确实会引发错误。所以它看起来像是添加的作品,但它只是没有保存或什么?

您可能正在这样做:

>> print car_1.tires
carthings.tires.None

这是"related objects manager"的代表。 你可能想做这样的事情:

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

其中 returns 一个查询集,它的表示更有意义,因为它实际上执行查询以显示关系中的第一个元素。

顺便说一句,你不需要 save 添加轮胎关系后的模型,因为你不需要更新汽车 table。