我试图让客户与电子邮件和电话建立一对多的关系。
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,这很奇怪。
有想法吗?
答案 0 :(得分:1)
您正在序列化需要FK的模型(Client
)。如果希望它支持空值,则应在模型中进行:
client = models.ForeignKey(Client, on_delete=models.CASCADE, related_name='emails', null=True, blank=True)