繁体   English   中英

Django-rest-framework中的联接表字段

[英]Joined table fields in Django-rest-framework

我正在从PHP到Django的迁移项目中,无法更改数据库的架构

在有些地方,对于没有FK的字段,存在多个联接,我现在无权添加它们。 甚至在我的Django模型上,由于数据库巨大且项目交付受时间限制。

我正在使用Django-rest-framework并覆盖list方法和queryset以接受这些原始sql。

sql = """SELECT
  a.field1,
  b.field2
FROM a
LEFT JOIN b ON a.fieldx = b.fieldy"""

问题是我无法在字段元组内的序列化程序类上添加联接表的字段,因为我说model = models.A,并且此模型没有有关模型B的信息。

您的帮助将不胜感激。

谢谢!

更新我只使用viewset。 我没有使用任何视图(这是错吗?)我的视图集

class AdminclassinfoViewSet(viewsets.ModelViewSet): 
    queryset = models.Classroominfo.objects.all()
    serializer_class = ClassroominfoSerializer

    def list(self, request):
       sql = """
         SELECT -- DISTINCT 
           cri.classroomid,
           cri.assessmentid, 
           cri.resourceid,
           al.assessmenttype,
           al.assessmenttitle,
           ri.resourcetype,
           ri.resourcetitle,
           wwi.writtenworktitle,
           cri.writtenworkid, 
           si.firstname,
           si.imageurl,
           date(cri.posteddate) as posteddate,
           cri.studentid
       FROM classroominfo cri
       LEFT OUTER JOIN assignassessmentinfo aai ON aai.assessmentid = cri.assessmentid 
                   AND aai.studentid = cri.studentid 
       LEFT OUTER JOIN assessmentlist al ON al.assessmentid = cri.assessmentid 
       LEFT OUTER JOIN assignresourceinfo ari  ON ari.resourceid = cri.resourceid 
                  AND ari.studentid = cri.studentid 
       LEFT OUTER JOIN resourceinfo ri ON ri.resourceid = cri.resourceid
       LEFT OUTER JOIN assignwrittenworkinfo awwi ON awwi.writtenworkid = cri.writtenworkid
       LEFT OUTER JOIN writtenworkinfo wwi ON wwi.writtenworkid = cri.writtenworkid
       LEFT OUTER JOIN logininfo li ON li.loginid = cri.studentid
       LEFT OUTER JOIN studentinfo si ON si.username = li.username
       WHERE ( ari.isclassroom =1 OR 
             aai.isclassroom =1 OR 
            awwi.isclassroom=1 ) 
       ORDER BY cri.classroomid DESC
       """
       queryset = models.Classroominfo.objects.raw(sql)
       serializer_class = ClassroominfoSerializer
       serializer = ClassroominfoSerializer(queryset, many=True)        
       return Response(serializer.data)

我的序列化器。 我不知道如何在这里引用合并的字段...

class ClassroominfoSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.Classroominfo
        fields = ('classroomid',  'assessmentid','resourceid',
              'writtenworkid')

由于在截止日期之前,我还原为直接运行查询,并将其转换为字典列表,然后从我的viewset列表方法返回,如下所示:

desc = cursor.description
result =  [
            dict(zip([col[0] for col in desc], row))
            for row in cursor.fetchall()
    ]
return Response(result)

它仍然使用Django Rest API接口,因此偶尔进行硬编码的SQL查询对我来说并不重要。

但是,如果Django Rest Framework 3.x能够灵活处理此类用例,我将不胜感激。

因此,给定您的SQL查询,看来classroominfo表在某种星形模式的中心。 您应该能够使用“ depth”属性来包括嵌套序列化

class ClassroominfoSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.Classroominfo
        fields = ('classroomid',  'assessmentid','resourceid', 'writtenworkid')
        depth = 2

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM