Django Rest: Как сериализовать модель с двумя иностранными ключами - PullRequest
0 голосов
/ 05 января 2020

У меня есть 3 модели: пользователь, адрес и AdressToUser в качестве модели адреса будут использоваться в качестве адреса для другой модели в моем проекте.

class Adress(models.Model):
    """
    Adresse utilisable pour les extras et les restaus
    """
    numero = models.PositiveIntegerField(_('numéro'), blank=True, null=True)
    adress = models.CharField(_('nom de la voie'), max_length=254, blank=False, null=False)
    code_postal = models.PositiveIntegerField(_('Code Postal'), blank=False, null=False)
    ville = models.CharField(_('Ville'), max_length=100, blank=False, null=False)


    def __str__(self):
        return '%s %s %s %s' % (self.numero, self.adress, self.code_postal, self.ville )    


class AdressToUser(models.Model):
    user = models.ForeignKey(User, verbose_name="Utilisateur", on_delete=models.CASCADE, related_name='adressu',)
    adress = models.ForeignKey(Adress, verbose_name="Adresse", on_delete=models.CASCADE, related_name='adressa')

    def __str__(self):
        return '%s %s' % (self.user_id, self.adress)

последняя модель: пользователь si определен с помощью сериализатора:

class UserSerializer(serializers.ModelSerializer):

    class Meta:
        model = User
        fields = ('id', 'username', 'password', 'email', 'first_name', 'last_name')
        # permet de cacher le password à l'affichage du user
        extra_kwargs = {'password': {'write_only': True, 'required':True}}
        # permet de hasher le password avant enregistrement sinon en clair
    def create(self, validated_data):

        user = User.objects.create_user(**validated_data)
        Token.objects.create(user=user)

        return user

цель состоит в следующем: я хочу зарегистрировать обе модели User, Adress и AdressToUser с одним сериализатором.

class AdressSerializer(serializers.ModelSerializer):

    class Meta:
        model = Adress
        fields =('__all__')

class AdressToUserSerializer(serializers.ModelSerializer):

    user = UserSerializer(many=False)
    adress = AdressSerializer(many=False)

    class Meta:
        model = AdressToUser
        fields = ('user', 'adress')

        # authentication_classes = (TokenAuthentication,)
        # permission_classes = (IsAuthenticated,)

    def create(self, validated_data):
        user_data = validated_data.pop('user')
        user = UserSerializer(data=user_data)
        user.is_valid()
        user = user.save()

        adress_data = validated_data.pop('adress')
        adress = AdressSerializer(data=adress_data)
        adress.is_valid()
        adress = adress.save()

        print(user.id, adress.id) #just to see what they are
        #
        # 
        AdressToUser.objects.create(**{'user': user.id, 'adress_id': adress.id})

        return AdressToUser

У меня возникает следующая проблема:

Невозможно назначить «xx»: «AdressToUser.user» должен быть экземпляром «User».

На этом этапе я не удалось создать экземпляр AdressToUser. Я прочитал и попробовал множество различных решений этой проблемы без успеха.

Спасибо за предоставленную помощь.

...