我有两个型号,版本和描述。
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中进行此操作。
答案 0 :(得分:0)
你无法使用django orm。 django有很多你无法做的事情。对于这些情况,您可以使用直接SQL(来自django.db导入连接,事务等...)或者如果查询结果可以用于您描述的对象 - 那么您可以使用原始查询(link)