Django rest框架序列化许多模型的查询集

时间:2015-10-26 15:05:29

标签: django-rest-framework django-queryset

我想结合来自2个不同模型的2个查询集,然后我需要按日期排序,最后我的目标是序列化它。

到目前为止,我做到了:

last_actions = serializers.SerializerMethodField()

def get_last_actions(self, obj):

    prc = obj.product_request_configs.all().order_by('modified_date')[:5]
    psc = obj.product_send_configs.all().order_by('modified_date')[:5]

    result_list = sorted(
        chain(prc, psc),
           key=attrgetter('modified_date'),
           reverse=True)

但我不知道如何调用我的两个django rest序列化器,以便我可以返回正确的数据。

如果我可以创建一个数据库视图,我认为它会更简单。

1 个答案:

答案 0 :(得分:0)

序列化程序旨在匹配一个模型关系,因此我们需要为您要实现的逻辑创建自定义Model

class CustomModel(models.Model):

    def dictfetchall(self, cursor):
        """Returns all rows from a cursor as a dict"""
        desc = cursor.description
        return [dict(zip([col[0] for col in desc], row))
                for row in cursor.fetchall()]

    def yourMethod(self):
        cursor = connection.cursor()
        cursor.execute("""
                        select field1, field2 from app_table
                        where field1=%s and field2=%s group by field1
                        """,
                        [value1, value2,]
                      )
        return self.dictfetchall(cursor)

    class Meta:
        abstract = True

这将返回一个字典,然后您可以使用如下的seializer序列化该响应:

class CustomModelSerializer(serializers.Serializer):
    field1 = serializers.IntegerField()
    field2 = serializers.CharField()

请注意,在SQL上,您可以使用as关键字重命名某些字段,字段的当前名称必须与序列化程序中的var名称匹配。