Django Rest Framework:在子模型上添加超链接相关字段

Django Rest Framework: Add hyperlink related field on sub model

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

假设我有以下型号:

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'
         )

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

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

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

我建议在同一个查询中也 select 相关模型,因此将其用于:

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