我正在尝试制作一个在网上绘制图表的工具。我有一个这样的模型:
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,有没有更好的方法呢?
答案 0 :(得分:1)
您是否需要extra()
来电?如果该调用的唯一目的是重命名字段,则可以从查询集中省略该字段,并使用序列化程序中的SerializerMethodField重命名该字段。我假设planeable
是BlockRepresentation
模型中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 ''