python - 如何提供正确的请求正文来序列化 Django 通用外键?

标签 python django django-rest-framework jwt postman

我有一个名为“电话”的通用模型:

(my_project/apps/phones/models.py)

class Phone(Model):
    owner_name = CharField(max_length=50)
    number = CharField(max_length=20)

    content_type = ForeignKey(ContentType, on_delete=CASCADE)
    object_id = PositiveIntegerField()
    phone_object = GenericForeignKey('content_type', 'object_id')

我还有一个名为“Client”的模型:

(my_project/apps/clients/models.py)

class Client(Model):
    employee = ForeignKey(Employee, on_delete=CASCADE)
    title = CharField(max_length=50)

    phones = GenericRelation(Phone)

我还有一个用于“客户端”的序列化器:

(my_project/apps/clients/serializers.py)

class ClientSerializer(ModelSerializer):
    id = IntegerField(read_only=True)
    employee_id = PrimaryKeyRelatedField(queryset=Employee.objects.all(), source='employee', required=True)
    title = CharField(required=True)

我遵循了 drf-documenation ( http://www.django-rest-framework.org/api-guide/relations/#generic-relationships ),据我了解,我需要将自定义类放在同一个文件中,所以这是我的 client/serializers.py 的样子:

(my_project/apps/clients/serializers.py)

class ClientSerializer(ModelSerializer):
    id = IntegerField(read_only=True)
    employee_id = PrimaryKeyRelatedField(queryset=Employee.objects.all(), source='employee', required=True)
    title = CharField(required=True)

class PhoneObjectRelatedField(RelatedField):
    def to_representation(self, value):
        if isinstance(value, Client):
            serializer = ClientSerializer(value)
        else:
            raise Exception('Unexpected type of phone_object')
        return serializer.data

对于我使用 PostMan 的请求,因此这是我使用电话号码创建新客户的请求: enter image description here

但是什么也没做,新客户可以成功创建,但他们只是不包含任何电话号码,请帮忙!

最佳答案

您可以将相关字段添加到序列化器字段中

class ClientSerializer(ModelSerializer):
    id = IntegerField(read_only=True)
    employee_id = PrimaryKeyRelatedField(queryset=Employee.objects.all(), source='employee', required=True)
    title = CharField(required=True)
    phone = PhoneObjectRelatedField()

由@Madi7更新

电话 = PhoneObjectRelatedField(queryset=Phone.objects.all())

关于python - 如何提供正确的请求正文来序列化 Django 通用外键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48780201/

相关文章:

对 POST 的 Django Rest Framework 对象级权限

python - 使用Django Rest Framework的APITestCase时出错

python - 向一叠玻璃杯中加水

python - 当输入错误的用户输入时,难以设置循环来继续程序

python - 在 Windows 下使用 PySide 的 QtWebKit 和 py2exe

python - South 不认识我的模型

django 剩余元素被截断

python - Django Rest框架自定义过滤后端数据重复

django - Django ORM 与 Oracle 的性能差

python - Django ModelForm - 使用外键创建实例