考虑这两个模型:
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_name
是CarType
中的主键,因此第二个代码不会生成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')
答案 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'