将可扩展字段添加到自相关模型上的序列化程序

Add expandable field to Serializer on Self Related Model

我有一个自相关的用户详细信息模型,用于创建两个用户之间的关系。

型号

class AdvDetails(models.Model):
    user_id = models.UUIDField(primary_key=True,default=uuid.uuid4,editable=False)
    title = models.CharField(max_length=5, choices=[('Mr', 'Mr'), ('Ms', 'Ms'), ('Mrs', 'Mrs'), ('Dr', 'Dr'), ('NA', '')], default='NA')
    first_name = models.CharField(max_length=255)
    last_name = models.CharField(max_length=255)
    email_id = models.EmailField(null=True, blank=True, default=None)
    parent_profile = models.ForeignKey("self", null=True, blank=True)

查看集

class AdvDetailsViewSet(viewsets.ModelViewSet):
    serializer_class = AdvDetailsSerializer
    filter_backends = (filters.SearchFilter,DjangoFilterBackend, filters.OrderingFilter)
    filter_fields = ('email_id,'parent_profile')
    search_fields = (  '^first_name',)

    def get_queryset(self):
        return AdvDetails.objects.all()

序列化程序

class AdvDetailsSerializer(serializers.ModelSerializer):

    class Meta:
        model = AdvDetails
        fields = '__all__'

这个结构方便我帮助获取下面格式的数据

{
  "user_id": "055cbde6-10ea-4558-86fc-1b42624ce760",
  "title": "Mr",
  "first_name": "foo",
  "last_name": "bar",
  "email_id" : "foo@bar.com"
  "parent_profile":"6c429d4c-9fb4-42e5-9d7d-9fc782f81fb0"
}

我想以这样的方式修改序列化程序,以便我可以获取父配置文件的 email_id 的数据,如下所示

{
  "user_id": "055cbde6-10ea-4558-86fc-1b42624ce760",
  "title": "Mr",
  "first_name": "foo",
  "last_name": "bar",
  "email_id" : "foo@bar.com",
  "parent_profile":"6c429d4c-9fb4-42e5-9d7d-9fc782f81fb0",
  "parent_email_id" : "parent@email.com"
}

非常感谢任何帮助。我试过 PrimaryKeyRelatedField 但它没有解决我的问题。

我制作了一个允许动态扩展字段的包,每个请求 on-demand: https://github.com/rsinger86/drf-flex-fields

针对您的情况:

class AdvDetailsSerializer(FlexFieldsModelSerializer):
    class Meta:
        model = AdvDetails
        fields = ('user_id', 'title', 'first_name', 'last_name', 'email_id', 'parent_profile', 'parent_email_id' )
        expandable_fields = {'parent_profile': '<app_name>.AdvDetailsSerializer'}

<app_name> 替换为定义序列化程序的 Django 应用程序的名称,以便延迟加载。

如果您想静态扩展一个字段,您可以将该字段定义为嵌套序列化程序:

class AdvDetailsSerializer(serializers.ModelSerializer):
    parent_profile = ProfileProfileSerializer()

    class Meta:
        model = AdvDetails
        fields = (
           'user_id', 
           'title',
           'first_name',
           'last_name', 
           'email_id',
           'parent_profile',
           'parent_email_id'
        )