在django中直接提供外键值

Directly providing foreign key value in django

考虑这两个模型:

class CarType(models.Model):
   code_name = models.SlugField(primary_key=True)
   name = models.CharField(max_length=20)

class Car(models.Model):
   name = models.CharField(max_length=30)
   car_type = models.ForeignKey('CarType')

假设我们想要获取所有轿车,而不是这个查询:

Car.objects.filter(car_type=CarType.objects.get(code_name='sedan'))

我们可以使用这个查询:

sedan_cars = Car.objects.filter(car_type__code_name='sedan')

因为 code_nameCarType 中的主键,第二个代码不会生成 2 个查询(与第一个一样),甚至不会使用 SQL 连接。

如何创建 Car 对象?天真的方式是这样的:

Car.objects.create(name='Tesla S', car_type=CarType.objects.get(code_name='sedan'))

这将查询 CarType 以找出符合条件 code_name='sedan' 的行的主键值,并在 Car [=43 的 car_type 字段中使用该主键=].因为我们已经知道 CarType 的主键值,所以这将是一个非常不必要的额外查询。 ( django 是否足够聪明来避免这种情况?

如何直接提供car_type值?我尝试了这两个但都失败了:

Car.objects.create(name='Tesla S', car_type='sedan')
Car.objects.create(name='Tesla S', car_type__code_name='sedan')

还有一个额外的字段car_type_id,其中包含外部对象的原始 ID。您可以在创建新的 Car 对象时写入它。所以代码:

Car.objects.create(name='Tesla S', car_type_id='sedan')

应该可以正常工作。

因为你已经给 car_type 作为外键你需要先给 car 对象然后声明 car_type:

c = Car.objects.filter(car_type=CarType.objects.get(code_name='sedan'))
c.car_type = 'sedan'