Django Rest框架系列化关系

Django Rest框架系列化关系,django,django-rest-framework,Django,Django Rest Framework,如何序列化相关模型中的字段 我有一个模型: class Order(models.Model): order_id = models.BigIntegerField(verbose_name='Order ID', unique=True) order_name = models.CharField(verbose_name='Order name', max_length=255) order_type = models.IntegerField(verbose_nam

如何序列化相关模型中的字段

我有一个模型:

class Order(models.Model):
    order_id = models.BigIntegerField(verbose_name='Order ID', unique=True)
    order_name = models.CharField(verbose_name='Order name', max_length=255)
    order_type = models.IntegerField(verbose_name='Campaign type')

class Types(models.Model):
    delimiter = models.CharField(verbose_name='Delimiter', max_length=255)
    status = models.BooleanField(verbose_name='Status', default=True)
    title = models.CharField(verbose_name='Title', max_length=255)

class User(models.Model):
    name = models.CharField(verbose_name='User name', max_length=200, unique=True)

class Report(models.Model):
    order = models.ForeignKey(Order, to_field='order_id', verbose_name='Order ID')
    user = models.ForeignKey(User, verbose_name='User ID')
    ad_type = models.ForeignKey(Types, verbose_name='Type')
    imp = models.IntegerField(verbose_name='Total imp')
    month = models.DateField(verbose_name='Month', default=datetime.datetime.today)
视图:

序列化程序:

class ReportSerializer(ModelSerializer):

    class Meta:
        model = Report
        depth = 1
class ReportSerializer(serializers.ModelSerializer):
    user = serializers.IntegerField()
    user_name = serializers.CharField()
    order_id = serializers.IntegerField()
    order_name = serializers.CharField()
    order_type = serializers.IntegerField()
    imp = serializers.IntegerField()

class Meta:
    model = Report
    fields = [
        'user', 'user_name', 'order_id', 'order_name',
        'order_type', 'imp'
    ]
    depth = 1

def to_representation(self, instance):
    Reports = namedtuple('Reports', [
        'user',
        'user_name',
        'order_id',
        'order_name',
        'order_type',
        'imp',
    ])
    return super(ReportSerializer, self).to_representation(
        Reports(*instance)._asdict()
    )
我需要在get_queryset()中获取“queryset”中的所有字段 但我有一个错误:

试图获取上的字段
imp
的值时,获取了AttributeError 序列化程序
ReportSerializer
。序列化程序字段可能已命名 不正确且不匹配
元组上的任何属性或键
例如。原始异常文本为:“tuple”对象没有属性
“小鬼”

但是,如果我返回get_queryset(),只需Report.objects.filter(month=month).all(),我将获取所有对象和包含所有字段的相关对象,而不聚合imp,也不进行分组


所以问题是如何使序列化程序返回在queryset中设置的结构

get_queryset
方法需要返回queryset,但您返回元组是因为。要么删除它以返回查询集,要么使用更通用的视图,如
APIView

我找到了一种方法

当我使用.values_list()时,它返回list对象而不是queryset对象。所以对于serializer,请理解我在serializer中定义的所有字段列表中的内容。在to_representation()中,我按原样返回字典

序列化程序:

class ReportSerializer(ModelSerializer):

    class Meta:
        model = Report
        depth = 1
class ReportSerializer(serializers.ModelSerializer):
    user = serializers.IntegerField()
    user_name = serializers.CharField()
    order_id = serializers.IntegerField()
    order_name = serializers.CharField()
    order_type = serializers.IntegerField()
    imp = serializers.IntegerField()

class Meta:
    model = Report
    fields = [
        'user', 'user_name', 'order_id', 'order_name',
        'order_type', 'imp'
    ]
    depth = 1

def to_representation(self, instance):
    Reports = namedtuple('Reports', [
        'user',
        'user_name',
        'order_id',
        'order_name',
        'order_type',
        'imp',
    ])
    return super(ReportSerializer, self).to_representation(
        Reports(*instance)._asdict()
    )
视图:


很抱歉我在回答中添加了描述。