考虑这两个模型:
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
的主键值,这将是一个非常不必要的额外查询。 (或者 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')
应该可以正常工作。
关于python - 在django中直接提供外键值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35340228/