Django Rest Serializer外键为必需错误

时间:2019-09-30 10:15:51

标签: django django-rest-framework serializer

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

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”:“家庭”,“电子邮件”:“ test@gmail.com”}],“电话”:[] ,“名称”:“我”}

所以我的目标是,如果在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中提取emails数组并进行for循环。 对于(在emailData中编辑):

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

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

有想法吗?

1 个答案:

答案 0 :(得分:1)

您正在序列化需要FK的模型(Client)。如果希望它支持空值,则应在模型中进行:

client = models.ForeignKey(Client, on_delete=models.CASCADE, related_name='emails', null=True, blank=True)