【问题标题】:Django rest framework serialize queryset of many modelsDjango rest框架序列化许多模型的查询集
【发布时间】:2016-01-25 17:56:54
【问题描述】:

我想组合来自 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 序列化程序以便返回正确的数据。

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

【问题讨论】:

    标签: django-rest-framework django-queryset


    【解决方案1】:

    序列化器是为匹配一个模型关系而设计的,因此我们需要为您要实现的逻辑创建一个自定义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
    

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

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

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

    【讨论】:

      猜你喜欢
      • 2018-03-10
      • 2014-12-19
      • 1970-01-01
      • 1970-01-01
      • 2016-04-07
      • 2012-11-16
      • 1970-01-01
      • 1970-01-01
      • 2014-07-26
      相关资源
      最近更新 更多