【问题标题】:Convert SQL QUERY to django QUERY将 SQL QUERY 转换为 django QUERY
【发布时间】:2014-03-18 10:52:42
【问题描述】:

我正在尝试将 sql 查询转换为 django 查询但未能做到这一点,谁能帮助我

select id,name,round(value::numeric,2) as value, st_transform(geometry, 3857) as geometry
        from net_rest
        where state_id in (1,2) and name = 'height'
        union
        (select d.id,d.restriction,d.value, st_transform(d.geometry, 3857) as geometry from display_rest d
        where d.restriction='height' and condition_id not in (select condition_id 
        from net_rest_conditions where version_id = 2)

或者这个

select id,name,value as value, geometry
        from net_rest
        where state_id in (1,2) and name = 'height'
        union
        (select d.id,d.restriction,d.value,geometry from display_rest d
        where d.restriction='height' and condition_id not in (select condition_id 
        from net_rest_conditions where version_id = 2)

更新了这里的问题

我正在使用 django django rest framework 序列化 net_rest 模型,基本上我正在从事与 GIS 相关的项目,我必须制作 rest api 来公开数据

这是我的一些模型

class net_rest(models.Model):
    name = models.CharField(max_length=50, blank=True)
    value = models.FloatField()
    state_id = models.IntegerField(null=True, blank=True)
    geometry = models.GeometryField(null=True, blank=True)
    objects = models.GeoManager()

    class Meta:
        db_table = u'tbl_net_rest'

    def __unicode__(self):
        return '%s' % self.name



class display_rest(models.Model):
    restriction = models.CharField(max_length=45, blank=True)
    link_id = models.IntegerField(blank=True, null=True)
    condition_id = models.IntegerField(blank=True, null=True)
    value = models.FloatField(blank=True, null=True)
    geometry = models.GeometryField(blank=True, null=True)
    class Meta:
        db_table = u'tbl_display_rest'



class net_rest_conditions(models.Model):
    condition_id = models.IntegerField()
    version_id =  models.IntegerField(blank=True, null=True)
    class Meta:
        db_table = u'tbl_net_rest_conditions'

class networkSerializer(serializers.GeoModelSerializer):
    class Meta:
        model = net_rest
        fields = ('id', 'name', 'value', 'geometry')

这里是视图

class networkSerializerViewSet(viewsets.ModelViewSet):

    q1 = display_rest.objects.values_list('id', 'name', 'value', 'geometry').filter(restriction='height')\
        .exclude(condition_id__in=net_rest_conditions.objects.filter(version_id=2).values_list('condition_id',flat=True))

    q2 = net_rest.objects.all().filter(Q(name="height"), Q(state_id=1) | Q(state_id=2)).values_list('id', 'value', 'geometry')

    queryset = q1 | q2

    serializer_class = networkSerializer

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:

    在 django 中无法进行更复杂的查询,您可以使用原始查询。

    <OBJECT>.objects.raw('sql statement goes here')
    

    【讨论】:

    • 我在我的问题中提到过拆分查询还有其他方法吗
    • @AskQuestion 拆分查询是什么意思?
    • 我在上面做了(q1)和(q2)两个查询输出都是正确的,现在我想合并这些查询
    • @AskQuestion for union 我们必须使用 queryset = q1 | q2 ,看起来你在你看来是这样做的。
    • 是的,但由于休息框架,它对我不起作用,它抛出异常' q1 和 q2 不是同一模型'
    猜你喜欢
    • 2017-02-17
    • 1970-01-01
    • 2016-08-29
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 2018-05-03
    • 2021-12-17
    • 2015-06-21
    相关资源
    最近更新 更多