Сохранение экземпляра с помощью внешнего ключа в Django - PullRequest
0 голосов
/ 19 мая 2018
class B(models.model):
    # some fields


class A(models.Model):
    b = models.ForeignKey(B)

Сериализатор:

class B_Serializer(serializers.ModelSerializer):
    class Meta:
        model = B
        fields = '__all__'


class A_Serializer(serializers.ModelSerializer):
    b = BSerializer()
    class Meta:
        model = A
        fields = '__all__'

Задача:

def task():
    data = {}
    b = B.objects.get(id=1)
    data['b'] = b
    serializer = A_Serializer(data=data)
    if serializer.is_valid():
        serializer.save()         

Но serailizer.is_valid () выдает ошибку, что он ожидал словарь, но получил этот объект.Теперь, если я сделаю это -

data['b'] = b.__dict__

, я получу ошибку, что B с этим идентификатором уже присутствует.B - modelSerializer, вызывающий serializer.is_valid () из функции, которая является задачей в сельдерее

1 Ответ

0 голосов
/ 19 мая 2018

Вместо предоставления b объекта для данных сериализатора вы можете передать его методу сохранения, например так:

def task():
    data = {}
    b = B.objects.get(id=1)
    serializer = A_Serializer(data=data)
    if serializer.is_valid():
        serializer.save(b=b)

Обратите внимание, вам необходимо заполнить поле b read_only в сериализаторе *:

class A_Serializer(serializers.ModelSerializer):
    b = BSerializer(read_only=True)
    class Meta:
        model = A
        fields = '__all__'

Вы можете найти соответствующую часть документа здесь .

...