Django 多对多不能在单元测试中工作,但可以在管理中工作

Mrs*_*ean 1 python django many-to-many django-models django-1.8

我有两个通过多对多领域相关的模型。

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)
Run Code Online (Sandbox Code Playgroud)

当我通过管理页面为汽车添加轮胎时它工作正常,但它在我的单元测试中不起作用,我无法弄清楚问题是什么(可能真的很简单)

这是我的单元测试:

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()
Run Code Online (Sandbox Code Playgroud)

这不会引发任何异常,但是当我打印 car_1.tires 时,它说carthings.Tires.None 我已经尝试过相反的方法,将 car_1 添加到 Tire_1.car_set 但这给出了相同的结果。我还尝试在多对多字段中添加不同类的对象只是为了看看会发生什么,这确实会引发错误。所以看起来添加有效,但它只是不保存或什么?

Jos*_*ilo 6

你可能正在这样做:

>> print car_1.tires
carthings.tires.None
Run Code Online (Sandbox Code Playgroud)

这是“相关对象管理器”的表示。您可能想要执行以下操作:

>> print car_1.tires.all()
[<Tire 1>]
Run Code Online (Sandbox Code Playgroud)

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

顺便save说一下,在向轮胎关系添加一些内容后,您不需要模型,因为您不需要更新 Cars 表。