django的查询集中的两个外连接(用于语言后退的情况)

时间:2013-12-27 07:04:46

标签: django django-rest-framework

我有两个型号,版本和描述。

class Version(models.Model):
    version_name   = models.CharField(max_length=100)
    version_value  = models.IntegerField()
    url            = models.CharField(max_length=240)

class Description(models.Model):
    version       = models.ForeignKey(Version)
    lang          = models.CharField(max_length=8)
    content       = models.TextField()

还有一个DescriptionSerializer。

class DescriptionSerializer(serializers.ModelSerializer):
    version_name = serializers.RelatedField(source='version')

    class Meta:
        model = Description
        fields = ('version_name', 'content')

他们以不同的语言存储了不同版本的描述。

E.g。

    Version
    +----+--------------+---------------+---------------------+
    | id | version_name | version_value | url                 |
    +----+--------------+---------------+---------------------+
    |  1 | 1.0.0        |             1 | http://abc.net.tw/  |
    |  2 | 1.0.1        |             2 | http://abc.net.tw/2 |
    |  3 | 1.0.2        |             3 | http://abc.net.tw/3 |
    |  4 | 1.0.3        |             4 | http://abc.net.tw/4 |
    |  7 | 1.1.0        |             5 | http://abc.net.tw/5 |
    |  8 | 1.1.1        |             6 | http://abc.net.tw/6 |
    +----+--------------+---------------+---------------------+

    Description
    +------------+-------+---------+
    | version_id | lang  | content |
    +------------+-------+---------+
    |          1 | en_US | English |
    |          1 | zh_TW | Chinese |
    |          1 | es_ES | Spanish |
    |          2 | en_US | English |
    |          2 | zh_TW | Chinese |
    |          2 | es_ES | Spanish |
    |          3 | en_US | English |
    |          3 | zh_TW | Chinese |
    |          3 | es_ES | Spanish |
    |          4 | en_US | English |
    |          7 | en_US | English |
    |          8 | en_US | English |
    |          4 | es_ES | Spanish |
    |          7 | es_ES | Spanish |
    +------------+-------+---------+

我正在使用django rest框架来实现一个Web API,它返回某种语言的每个版本的描述。如果不存在某种语言的描述,请改用英文版本。

我可以使用以下SQL来检索所需的结果。我已经阅读了DRF关于relatedField和反向关系的文档。但是我仍然无法弄清楚如何使用django的ORM来做同样的事情,并将它与django rest framework的序列化器一起使用。

select 
    coalesce(d.id, d2.id), coalesce(d.version_id, d2.version_id), coalesce(d.lang, d2.lang), coalesce(d.content, d2.content)
from
    version v 
    left outer join description d on v.id = d.version_id and d.lang='zh_TW'
    left outer join description d2 on v.id = d2.version_id and d2.lang='en_US'

请告知如何在django中进行此操作。

1 个答案:

答案 0 :(得分:0)

你无法使用django orm。 django有很多你无法做的事情。对于这些情况,您可以使用直接SQL(来自django.db导入连接,事务等...)或者如果查询结果可以用于您描述的对象 - 那么您可以使用原始查询(link