[Django Rest Serializer外键是必需的错误

问题描述 投票:0回答:1

我正在尝试让客户与电子邮件和电话建立一对多的关系。

class Client(models.Model):

class Email(models.Model):
    client = models.ForeignKey(Client, on_delete=models.CASCADE, related_name='emails')
    email = models.CharField(null=True, blank=True, max_length=50)

class Phone(models.Model):
    client = models.ForeignKey(Client, on_delete=models.CASCADE, related_name='phones')
    phone = models.CharField(null=True, blank=True, max_length=50)

这是我的序列化器

class ClientSerializer(serializers.ModelSerializer):
    emails = EmailSerializer(required=False, allow_null=True, many=True)
    phones = PhoneSerializer(required=False, allow_null=True, many=True)

我无法确定为什么该帖子将不会继续,因为它一直在说需要客户。

尽管我通过添加read_only = True使其起作用,即使我在ClientSerializer中定义了def create(self,validated_data),我也无法在json数据中保留电子邮件和电话数组。

这是我在views.py中调用序列化器的方式>

serializer = ClientSerializer(data=request.data)

这是json数据的样子

{ “ID”:0, “邮件”:[{ “ID”:0, “EMAILTYPE”: “家”, “电子邮件”: “[email protected]”}], “手机”:[], “名”: “我”}

因此,我的目标是,如果在emails数组中,如果有email属性,则将其插入,否则忽略。与电话相同。

这是我在views.py中称序列化器的方式>

@api_view('POST'])
def client(request):
    serializer = ClientSerializer(data=request.data)

    if serializer.is_valid():
        serializer.save()
        return Response(serializer.data, status=status.HTTP_200_OK)

因此在ClientSerializer中,我通过创建客户端对象Client.objects.create(validated_data);

然后从validated_data中提取电子邮件数组,并进行for循环。(在emailData中编辑):

Created an email = Email() object then
email.email = emailData.get('email')
email.client = client

但是它给我一个错误“列“ client_id”中的空值违反了非空约束”。当我执行print(email)时,来自email.client的client对象为null,这很奇怪,考虑到print(client)具有id。

思考?

我正在尝试让客户与电子邮件和电话建立一对多的关系。 Client(models.Model)类:Email(models.Model)类:client = models.ForeignKey(Client,on_delete = models ....

django django-rest-framework serializer
1个回答
0
投票

您正在序列化需要FK的模型(Client)。如果要支持空值,则应在模型中执行此操作:

client = models.ForeignKey(Client, on_delete=models.CASCADE, related_name='emails', null=True, blank=True)
© www.soinside.com 2019 - 2024. All rights reserved.