Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Django not recognize UUID Foreign Key

I had this current model:

class Apps(models.Model):
    """
    Apps são os aplicativos que terão financeiro gerido, uma empresa/usuario pode ter multiplos apps conectados
    """
    app_code = models.UUIDField(auto_created=True, default=uuid.uuid4, unique=True, primary_key=True)
    chave_app = models.UUIDField(auto_created=True, default=uuid.uuid4, unique=True)
    usuario = models.ForeignKey(Usuario, on_delete=models.CASCADE)
    descricao = models.CharField(max_length=100)

The usuario field is an ForeignKey...

The usuario model is this:

class Usuario(AbstractBaseUser):
    """
    Classe que ira gerir o cliente final, cadastrado via APP ou Webapp
    """
    user_id = models.UUIDField(auto_created=True, default=uuid.uuid4, unique=True, primary_key=True)
    nome = models.CharField(max_length=120)
    celular = models.CharField(max_length=20, unique=False)
    email = models.EmailField(max_length=100, unique=True)
    ativo = models.BooleanField(default=True)
    chave_api = models.UUIDField(auto_created=True, default=uuid.uuid4, unique=True)
    created_at = models.DateTimeField(auto_now_add=True)

    objects = AccountManager()

    USERNAME_FIELD = 'chave_api'
    REQUIRED_FIELDS = ['email', 'nome', 'celular']

    class Meta:
        ordering = ('-created_at',)

All works nice, but when i try to list apps on django-rest-framework as list. I did same way on anothers models, with no foreign key, and listing is all ok. The error is giving only on this view with Foreign Key.

TypeError at /apps/ str returned non-string (type UUID)

At database, my fields was inserted with this values:

[
  {
    "app_code": "423676e9968d41beaeeeb2da43fc56d8",
    "chave_app": "86c18ae7809e4bda88830090f309a00c",
    "descricao": "Matrix Cashback 2.0",
    "usuario_id": "998339b46bde40bca053978670626a6f"
  }
]

I'm using Django-rest-framework and Django in an personal project.

Don't know what to do now, did try lots of variants. It just do not recognize the Foreign Key as UUID.

My Serializer View is this:

class AppSerializer(serializers.Serializer):
    app_code = serializers.UUIDField(read_only=True)
    usuario = serializers.UUIDField(read_only=True)
    descricao = serializers.CharField(required=True, max_length=100)
    chave_app = serializers.UUIDField(read_only=True)
    chave_api = serializers.UUIDField(required=True)

    class Meta:
        model = Apps
        fields = ('app_code', 'chave_app', 'usuario', 'descricao')

    def create(self, validated_data):
        usuario = Usuario.objects.get(chave_api=validated_data.get('chave_api'))
        return Apps.objects.create(
            descricao=validated_data.get('descricao'),
            usuario=usuario
        )

    def update(self, instance, validated_data):
        instance.descricao = validated_data.get('descricao', instance.descricao)
        instance.save()
        return instance

Some help will be welcome! Thanks.

This is the error on browser when try to "list" all apps.

Error

like image 428
Raphael Schubert Avatar asked Oct 29 '25 04:10

Raphael Schubert


1 Answers

Founded the problem... When try to list the serializer, i used UUIDField on usuario. But need to be ReadOnlyField

My correct AppSerializer now was:

class AppSerializer(serializers.Serializer):
    app_code = serializers.UUIDField(read_only=True)
    usuario = serializers.ReadOnlyField(source='usuario.user_id')
    descricao = serializers.CharField(required=True, max_length=100)
    chave_app = serializers.UUIDField(read_only=True)
    # chave_api = serializers.UUIDField(required=True)

    class Meta:
        model = Apps
        fields = ('app_code', 'chave_app', 'usuario', 'descricao')

    def create(self, validated_data):
        usuario = Usuario.objects.get(chave_api=validated_data.get('chave_api'))
        return Apps.objects.create(
            descricao=validated_data.get('descricao'),
            usuario=usuario
        )

    def update(self, instance, validated_data):
        instance.descricao = validated_data.get('descricao', instance.descricao)
        instance.save()
        return instance
like image 101
Raphael Schubert Avatar answered Oct 31 '25 18:10

Raphael Schubert



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!