直接在django中提供外键值

时间:2016-02-11 13:08:55

标签: python django django-models django-queryset django-orm

考虑这两个模型:

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_type表的Car字段中使用该主键。由于我们已经知道CarType的主键值,因此这将是一个非常不必要的额外查询。 ( OR django足够智能以避免这种情况?

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

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

2 个答案:

答案 0 :(得分:4)

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

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

应该可以正常工作。

答案 1 :(得分:-1)

由于您已将car_type作为外键,因此您需要首先提供car对象,然后声明car_type

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