Django ORM SELECT加入

Dea*_*dly 10 python django django-models django-orm

呃

django中的型号:

class Key(models.Model):
    id     = models.AutoField(primary_key=True, blank=True)
    name   = models.CharField(max_length=50)


class Record(models.Model):
    id         = models.AutoField(primary_key=True, blank=True)
    project_id = models.IntegerField()
    name       = models.CharField(max_length=50)


class Value(models.Model):
    id        = models.AutoField(primary_key=True, blank=True)
    record    = models.ForeignKey(Record)
    key       = models.ForeignKey(Key)
    value     = models.CharField(max_length=255)
Run Code Online (Sandbox Code Playgroud)

我需要从DB中选择这个数据:

NAME (from record)
and fields related with this record
[NAME (from key), VALUE (from value)]
[NAME (from key), VALUE (from value)]
[...]
Run Code Online (Sandbox Code Playgroud)

我可以使用django ORM进行此选择吗?(例如在SQL select中看起来像这样)

SELECT
    `keeper_record`.`id` AS `record_id`,
    `keeper_record`.`name` AS `name`,
    `keeper_record`.`desc` AS `desc`,
    `keeper_key`.`name` AS `key_name`,
    `keeper_key`.`desc` AS `key_desc`,
    `keeper_value`.`value` AS `value_value`
FROM `keeper_record`
JOIN `keeper_value` ON `keeper_record`.`id` = `keeper_value`.`record_id`
JOIN `keeper_key` ON `keeper_key`.`id` = `keeper_value`.`key_id`
WHERE record_id = id
Run Code Online (Sandbox Code Playgroud)

Ala*_*air 8

以下选择与特定记录ID相关的值.然后,您可以按照外键获取相关记录和密钥.使用select_related最小化数据库查找.

# Select all values related to a record in your view
record = Record.objects.get(pk=record_id)
values = Value.objects.filter(record=record).select_related()

# In your template
{% for value in values %}
{{ value.record.name }} - {{ value.key.name }} - {{ value.value }}
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

选择多一条记录

在你的sql中,你有WHERE record_id = 1,所以我展示了如何获取特定记录的所有值.您还可以在一个查询中为多个记录选择值.

# filter all records which belong to the project with `project_id=1`
records = Record.objects.filter(project_id=1)
# select all values that belong to these records
values = Value.objects.filter(record__in=records).select_related().order_by('record')
Run Code Online (Sandbox Code Playgroud)

  • 我已经更新了选择多条记录的答案.希望能帮助到你. (2认同)