Django - создание экземпляра через сериализатор со ссылкой на внешний ключ

У меня есть агентства и пользователи. Я хочу создать экземпляры User через UserSerializer, у которых есть agency_id. Однако validated_data сериализатора не имеет agency_id после вызова is_valid().

class Agency(models.Model):
    name  = models.CharField(max_length=60)

class User(modes.Model):
    username =  models.CharField(max_length=60)
    agency   =  models.ForeignKey(Agency, blank=True, null=True)

class UserSerializer(serializers.ModelSerializer):

    class Meta:
        User = get_user_model()
        model = User

        fields = ( 'id', 'username', 'agency_id' )

        read_only_fields = ['id']

Попробуйте создать пользователя через сериализатор, принадлежащий агентству Acme:

agency = Agency.objects.create(name="Acme Agency")
serializer = UserSerializer(data={ 'username':'wiley', 'agency_id': agency.id} )

serializer.is_valid() # True
serializer.validated_data.get('agency_id') # None

Создание пользователя через UserManager с использованием идентификатора агентства работает нормально:

user = User.objects.create(username='wiley', agency_id=1)
user.agency.id # 1

напечатать serializer.data после serializer.is_valid () # True

giveJob 10.08.2018 17:32
0
1
59
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

используйте agency вместо agency_id в UserSerializer as

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        User = get_user_model()
        model = User
        fields = ('id', 'username', 'agency')
        read_only_fields = ['id']

и используйте серайлизатор как,

serializer = UserSerializer(data={ 'username':'wiley', 'agency': agency.id} )

Это прекрасно работает! Я ожидал, что имена полей будут имитировать имена базового объекта ...

Codewise 10.08.2018 22:15

Другие вопросы по теме