将ModelSerializer与已连接的记录一起使用

时间:2015-08-03 15:10:16

标签: django python-3.x django-rest-framework

我正在尝试制作一个在网上绘制图表的工具。我有一个这样的模型:

class PlaneableItem(Model):
    name = models.CharField(max_length=NAME_LENGTH, blank=True)

class View(PlaneableItem):
    # Some useful details

class Anchor(Model):
    view = models.ForeignKey(View)
    planeable = models.ForeignKey(PlaneableItem)

class BlockRepresentation(Anchor):
    # Useful details

class LineRepresentation(Anchor):
    # Useful details

我尝试创建一个rest API,它返回特定视图的所有块和行的列表,包括它们引用的planeable的名称。

我可以使用以下方法获取查询集:

qs = BlockRepresentation.objects.filter(view=theview).all()
qs.select_related('planeable')
qs.extra(select={'name': 'rest_api_planeableitem.name'})

但是,现在我不能在其上使用ModelSerializer,因为字段'name'不是BlockRepresentation的一部分。

我真的很喜欢ModelSerializers,有没有更好的方法呢?

1 个答案:

答案 0 :(得分:1)

您是否需要extra()来电?如果该调用的唯一目的是重命名字段,则可以从查询集中省略该字段,并使用序列化程序中的SerializerMethodField重命名该字段。我假设planeableBlockRepresentation模型中PlaneableItem模型中的ForeignKey字段。示例代码:

from rest_framework import serializers

class BlockRepresentationSerializer(serializers.ModelSerializer):
    # Some fields
    name = serializers.SerializerMethodField()

    class Meta:
        model = BlockRepresentation

    def get_name(self, obj):
        if obj.planeable:
            return obj.planeable.name
        return ''