Ошибка внешнего ключа Django Rest Serializer - PullRequest
0 голосов
/ 30 сентября 2019

Я пытаюсь, чтобы у клиента была связь 1: 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, даже если я определю def create (self, validated_data) в ClientSerializer, я не могу заполучитьмассив адресов электронной почты и телефонов в данных json.

Так я назвал сериализатор в views.py

serializer = ClientSerializer(data=request.data)

Так выглядят данные json

{ "ID": 0, "электронная почта": [{ "ID": 0, "EmailType": "Главная", "электронная почта": "test@gmail.com"}], "телефоны": [], "название":" me "}

Так что моя цель - если в массиве 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. for (ed в emailData):

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

Но это дает мне ошибку "нулевое значение в столбце" client_id "нарушает ненулевое ограничение". Когда я делаю печать (электронная почта), объект client из email.client имеет значение null, что странно, учитывая, что print (client) имеет идентификатор.

Мысли?

1 Ответ

1 голос
/ 30 сентября 2019

Вы сериализуете модель (Client), которая ожидает FK. Если вы хотите, чтобы это поддерживало нулевые значения, вы должны сделать в своей модели:

client = models.ForeignKey(Client, on_delete=models.CASCADE, related_name='emails', null=True, blank=True)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...