【问题标题】:Django: Creating an M2M relationship through an intermediate table using multiple keysDjango:使用多个键通过中间表创建 M2M 关系
【发布时间】:2013-12-16 12:10:10
【问题描述】:

我正在使用已使用以下模型映射到 Django ORM 的外部 MySQL 数据库:

class SchemaCategory(models.Model):

    schema_id = models.IntegerField(primary_key=True)
    language_id = models.IntegerField(primary_key = True)
    category = models.CharField(max_length = 255L,blank = True)

    unique_together = (('schema_id','language_id',),)

class Equipment(models.Model):

    vehicle_id = models.BigIntegerField(primary_key = True)
    schema_id = models.IntegerField(primary_key = True)
    option_id = models.IntegerField(primary_key = True)
    record_id = models.IntegerField(primary_key = True)
    location = models.CharField(max_length=50L, blank=True)
    data_value = models.CharField(max_length=255L,primary_key = True)
    condition = models.TextField(blank=True)

    unique_together = (('vehicle_id','schema_id','option_id','data_value','record_id'))

    class Meta:
        db_table = 'equipment'

class OptionList(models.Model):

    vehicle_id = models.BigIntegerField(primary_key = True)
    option_id = models.IntegerField(primary_key = True)

    option_type = models.CharField(max_length=10L)
    option_code = models.CharField(max_length=255L, blank=True)
    manuf_name = models.CharField(max_length=255L)
    #...

    unique_together = (('vehicle_id','option_id'),)

    class Meta:
        db_table = 'option_list'

现在,我想从 OptionList 中为给定的 vehicle_id 加载所有条目,并且对于每个选项,加入适用于它的 SchemaCategories。 OptionList 和 SchemaCategory 通过 Equipment 表关联(vehicle_id 和 option_id 产生 schema_id,可以用来获取所有类别)。现在我正在使用如下所示的 MySQL 查询:

select A.option_type, 
    A.option_code, 
    A.manuf_name, 
    A.option_id,
    group_concat(distinct C.category) as category
from option_list A 
left join equipment B
on
    A.vehicle_id = B.vehicle_id 
    and
    A.option_id = B.option_id
left join schema_categories C
on
    C.language_id = 3
    and
    C.schema_id = B.schema_id
where 
    A.vehicle_id=? 
group by
    A.option_id
order by 
    A.manuf_name asc

知道如何使用 Django ORM 实现这一点吗?我尝试通过 Equipment 表在 OptionList 和 SchemaCategory 之间使用 ManyToMany 关系,但我不确定如何使用 ORM 指定连接的 ON 条件。

【问题讨论】:

标签: python mysql sql django orm


【解决方案1】:

您似乎正在寻找一种将额外数据添加到多对多关系的方法。检查此answer。您还可以在其中找到解释该主题的 Django 文档的链接。

【讨论】:

  • 不,不是。问题更多的是关系是通过复合外键而不是单个外键来定义的,因此添加额外的数据并不能解决问题。
  • 我的意思不是添加比您已有的更多的数据。根据你的需要:OptionList和SchemaCategory是通过Equipment表关联的(vehicle_id和option_id产生schema_id,可以用来获取所有类别。我觉得你应该试试set Equipment作为 SchemaCategory -- OptionList 关系的额外数据。
  • 好的,但是你会怎么做呢?据我所知,ManyToManyField 不支持复合键...
  • 你是对的。这是不支持的。因此,您将不得不审查您的模型是如何编写的。试着回答这些问题。 我真的需要所有这些主键,或者我可以使用 unique_together 语句获得相同的结果,仅此而已?查看您的模型,我想不出有这么多主键的原因。您真的只想要 OptionsList 表中的 一个 vehicle_id 吗??
  • 我很乐意重构模型以删除复合主键,但由于它是一个外部数据库(经常更改),这并不是一个真正的选择。此外,DB 布局还不错,在表中使用单独的 vehicle_id、option_id 和 schema_id 键是有意义的,因为它们在实践中都是必需的。
猜你喜欢
  • 2016-05-07
  • 2012-02-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-13
  • 2014-07-31
相关资源
最近更新 更多