【问题标题】:django DRF: how to Get related model field in serializerdjango DRF:如何在序列化程序中获取相关模型字段
【发布时间】:2016-07-11 20:07:20
【问题描述】:

我正在尝试从 Django Rest 框架返回一个 HttpResponse,包括来自 3 个链接模型的数据。模型是

class ErrorDb(models.Model):
    error_id = models.AutoField(primary_key=True)
    error_msg = models.CharField(max_length=500)
    user_name = models.CharField(max_length=45)
    class Meta:
        #managed = False
        db_table = 'error_db'

class ErrordbKey(models.Model):
    key_id = models.AutoField(primary_key=True)
    parent_areaid = models.IntegerField(blank=True, null=True)

    class Meta:
        #managed = False
        db_table = 'errordb_key'


class ErrordbMapping(models.Model):
    table_id = models.AutoField(primary_key=True)
    key = models.ForeignKey(ErrordbKey)
    error = models.ForeignKey(ErrorDb)
    class Meta:
        #managed = False
        db_table = 'errordb_mapping'
        unique_together = (('key', 'error'),)

下面是views.py:

def area_detail(request, area_id):

obj_ErrordbKey = ErrordbKey.objects.filter(parent_areaid=area_id)
#objects to get specific rows where area_id exists

if request.method == 'GET':
    obj_ErrordbMapping = ErrordbMapping.objects.filter(key__in=obj_ErrordbKey)
    serializer = TaskSerializer(obj_ErrordbMapping, many=True)
    return Response(serializer.data)

我尝试了以下序列化方法,请看外键关系 序列化器.py:

class ErrorDbSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = ErrorDb
        fields = ('error_msg','user_name')


class ErrordbKeySerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = ErrordbKey
        fields = ('area', 'filename')


class TaskSerializer(serializers.HyperlinkedModelSerializer):
    # errorDbdata = ErrorDbSerializer()
    # errordbKeydata = ErrordbKeySerializer()
    error = ErrorDbSerializer(source='error')
    key = ErrordbKeySerializer(source='key')
    class Meta:
        model = ErrordbMapping
        fields = ('key', 'error')

【问题讨论】:

    标签: python django serialization drf-nested-routers


    【解决方案1】:

    您可以使用serializer.CharFieldsource 并照常访问字段 throw fk:

    class TaskSerializer(serializers.HyperlinkedModelSerializer):
        error_field = serializers.CharField(read_only=True, source='error.error_msg')
        key_field = serializers.CharField(read_only=True, source='key.parent_areaid')
        class Meta:
            model = ErrordbMapping
            fields = ('error_field', 'key_field')
    

    【讨论】:

    • 我已经尝试了您的代码,但仍然无法获得任何 o/p 。只是一个空列表
    • @vm-power 你有什么异常还是什么?
    • 我可以从 django shell 中看到有效的数据对象: >>>obj_ErrordbKey = ErrordbKey.objects.filter(parent_areaid=3) >>>obj_ErrordbMapping = ErrordbMapping.objects.filter(key__in=obj_ErrordbKey) >>> obj_ErrordbMapping [, , ]
    猜你喜欢
    • 2014-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-20
    • 2020-12-24
    • 2023-03-25
    • 2023-04-09
    • 1970-01-01
    相关资源
    最近更新 更多