python - 在django中直接提供外键值

标签 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 的主键值,这将是一个非常不必要的额外查询。 (或者 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/

相关文章:

互联网连接中断的 Python 的 urllib.request.urlopen

python - 更改 Django 管理更改列表标题文本

django - Django-South 迁移期间的 ValidationError

Django 在 ManyToMany 计数上过滤模型?

python - 如何修复 : W602 deprecated form of raising exception

python - Pandas - 在 groupby 中聚合、排序和最大

python - pip 将本地包安装到目标目录

django - 将文件上传到django中的私有(private)位置

django - 使用 Django 和 NextJS 进行用户身份验证

django - 初始数据夹具中的用户