2014-11-22 33 views
0

我到一个PHP到Django的迁移项目,在这里我不能改变我的数据库的模式连接表的字段

有在多个连接在那里为字段,而FK的地方,我有现在没有权利添加它们。即使在我的Django模型中,也是因为数据库的大小和项目交付的时间限制。

我正在使用Django-rest-framework并重写列表方法和queryset来接受这些原始的sqls。

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

的问题是,因为我说的模型= models.A而这种模式没有关于模型B.信息,我不能在我的序列化器类添加字段元组 内部连接表的字段

您的帮助,将不胜感激。

谢谢!

UPDATE 我只使用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') 
+0

你可以包括你目前的序列化和视图?甚至可能是模型取决于他们有多相关? – 2014-11-22 15:49:47

+0

@Kevin更新了我的问题 – Jega 2014-11-22 18:33:15

回答

1

自从我上的最后期限,我恢复了运行queries directly并转换为类型的字典列表,并从视图集中的我的列表方法类似这样的返回:

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

它仍然使用Django的休息API接口,所以对于我来说偶尔会有一些硬编码的SQL查询并不重要。

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

0

因此,考虑到您的SQL查询,它似乎像classroominfo表是在某种星型模式的中心。您应该能够使用“深度”属性来包含nested serializations

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

不幸的是,这不会在API结果中带来我需要的字段。它只显示字段元组中的字段 – Jega 2014-11-23 04:09:56

+0

您是否尝试过相关字段? http://www.django-rest-framework.org/api-guide/relations#relatedfield – abeaamase 2014-11-23 04:35:49