当前位置: 首页 > 知识库问答 >
问题:

Django Rest序列化程序外键是必需的错误

唐声
2023-03-14

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

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_数据),我也无法在json数据中获得电子邮件和电话数组。

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

serializer = ClientSerializer(data=request.data)

这就是json数据的样子

{“id”:0,“电子邮件”:[{“id”:0,“电子邮件类型”:“主页”,“电子邮件”:”test@gmail.com“}],“电话”:[],“姓名”:“我”}

所以我的目标是如果在电子邮件数组中,如果有电子邮件属性,插入它,否则忽略。和电话一样。

这就是我在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中,我通过客户端创建客户端对象。物体。创建(已验证的_数据);

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

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

但是它给我一个错误“列中的空值”client_id“违反非空约束”。当我打印(电子邮件)时,email.client的客户端对象是null,这很奇怪,考虑到print(客户端)有一个id。

想法?

共有1个答案

乐正玺
2023-03-14

您正在序列化一个需要FK的模型(Client)。如果您希望它支持空值,您应该在模型中执行以下操作:

client = models.ForeignKey(Client, on_delete=models.CASCADE, related_name='emails', null=True, blank=True)
 类似资料:
  • 你好,我在从github到我的项目中实现一些代码源时遇到了问题,所以。。。我正在尝试构建一个管道,然后创建StreamStage来读取源代码,并使用项目中的方法构建一个queuesink,我总是遇到同样的错误“线程中的异常”main“java.lang.IllegalArgumentException:”mapFn“必须可序列化” 我正在阅读关于Hazelcast Jet序列化的文档,一切似乎都很

  • 问题内容: 我正在使用django rest框架来创建API。我有以下型号: 为类别创建序列化器: …这将为我提供: 我将如何从Item序列化程序获得相反的结果,即: 我已经阅读了有关其余框架的反向关系的文档,但这似乎与非反向字段的结果相同。我是否缺少明显的东西? 问题答案: 只需使用相关字段而不进行设置。 请注意,这也是因为你想要将输出命名为,而实际字段是,因此需要source在序列化程序字段上

  • 问题内容: 我一直在努力开发可在Django和Flash应用程序中使用的RESTful服务。 开发服务接口非常简单,但是我遇到了序列化具有外键和多对多关系的对象的问题。 我有一个像这样的模型: 然后,我将使用对此模型进行查询,以确保遵循外键关系: 获得对象后,我将其序列化,并将其传递回我的视图: 这就是我得到的,请注意,外键(object_type和个人)只是其相关对象的ID。 很好,但是我希望使

  • 问题内容: 使用Django REST Framework,标准的ModelSerializer将允许通过将ID作为整数发布来分配或更改ForeignKey模型关系。 从嵌套序列化程序中获取此行为的最简单方法是什么? 注意,我只在谈论分配现有数据库对象,而不是嵌套创建。 过去,我在序列化程序中使用附加的“ id”字段以及自定义和方法来解决这个问题,但是对我来说,这似乎是一个简单而频繁的问题,我很想

  • 本文向大家介绍什么是 Java 序列化?什么情况下需要序列化?相关面试题,主要包含被问及什么是 Java 序列化?什么情况下需要序列化?时的应答技巧和注意事项,需要的朋友参考一下 Java 序列化是为了保存各种对象在内存中的状态,并且可以把保存的对象状态再读出来。 以下情况需要使用 Java 序列化: 想把的内存中的对象状态保存到一个文件中或者数据库中时候; 想用套接字在网络上传送对象的时候; 想

  • 从文件中: read_only将其设置为True,以确保在序列化表示时使用该字段,而在反序列化期间更新实例时不使用该字段。 默认为假 required通常情况下,如果反序列化期间未提供字段,则会引发错误。如果反序列化过程中不需要此字段,则设置为false。 默认为True。 因此,我有一个模型,其中有一个字段不可为null,但我希望在pre_save方法中填充它,因此我在serializer中将该