【问题标题】:Django Rest Framework: Add hyperlink related field on sub modelDjango Rest Framework:在子模型上添加超链接相关字段
【发布时间】:2021-06-22 05:07:16
【问题描述】:

我正在尝试找出如何从关系模型中添加超链接相关字段。

假设我有以下模型:

class Model1(models.Model):
    id = models.AutoField(primary_key=True)
    model2 = models.OneToOneField(Model2, db_column='model2_id', related_name='model2_set', on_delete=CASCADE)
    
class Model2(models.Model):
    id = models.AutoField(primary_key=True)
    model3 = models.ForeignKey(Model3, db_column='model3_id',
        related_name='+', null=True, blank=True, on_delete=FOREIGNKEY_PROTECT)
    
class Model3(models.Model):
    id = models.AutoField(primary_key=True)
    description = models.TextField(db_column='description', null=True, blank=True, verbose_name=_('Description'))

我对 Model1 和 Model3 都有一个序列化程序,但对 Model2 没有

我想要以下输出

{
    "id":123,
    "model3":"http://example:123/api/model3/123"
} 

但在我的 model1 序列化程序中,我不能简单地为子模型调用超链接相关字段,因为它无法识别源

class Model1ListSerializer(ValidateByModelSerializer):
    id = serializers.IntegerField(read_only=True)
    model3 = serializers.HyperlinkedRelatedField(
            source='model2__model3',
            queryset=Model3.objects.all(),
            view_name='model3_rest-detail'
         )

实现这一目标的最佳方法是什么?

【问题讨论】:

    标签: django django-rest-framework django-serializer django-1.8


    【解决方案1】:

    作为源,您可以使用model2.model3 来访问该ForeignKey 的对象:

    class Model1ListSerializer(ValidateByModelSerializer):
        id = serializers.IntegerField(read_only=True)
        model3 = serializers.HyperlinkedRelatedField(
            source='model2.model3',
            queryset=Model3.objects.all(),
            view_name='model3_rest-detail'
         )

    我建议在同一个查询中也选择相关模型,所以使用它:

    Model1.objects<b>.select_related('model2', 'model2__model3')</b>

    【讨论】:

    • 哦,为什么我没有想到使用句号-.-谢谢男人
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-29
    • 1970-01-01
    • 2015-11-08
    • 1970-01-01
    • 2013-04-19
    • 2013-01-12
    相关资源
    最近更新 更多