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