[Django]-Django rest framework change primary key to use a unqiue field

28đź‘Ť

âś…

Assuming your GameProfile model looks like:

class GameProfile(models.Model)
    user = models.OneToOneField('User')

The serializer will be:

class GameProfileSerializer(serializers.HyperlinkedModelSerializer):
    user_id = serializers.Field(source='user.id')

    class Meta:
        model = GameProfile

Set the .lookup_field attribute on the view correctly:

    lookup_field = 'user_id'

Url will be:

/gameprofile/<user_id>
👤almalki

17đź‘Ť

In order to get the URLs to work, you might need to add lookup_field on the ViewSet, not just on the serializer. So you would have:

class GameProfileViewSet(viewsets.ModelViewSet):
    queryset = GameProfile.objects.all()
    serializer_class = GameProfileSerializer
    lookup_field = 'user__id'

In this case the lookup_field uses the double-underscore notation rather than the dot notation (dots won’t work in the regular expressions in the URL patterns). I was unable to get the solution proposed by @almalki and @patsweet to work; according to the documentation on serializers, “The value of this option [lookup_field] should correspond both with a kwarg in the URL conf, and with a field on the model”, so it’s possible that it doesn’t work with RelatedFields.

👤Avril

1đź‘Ť

If I’m understanding your question correctly, you want a url structure like so:

/api/<GameProfile-resource>/<user-pk>

If that is the case, you should checkout the lookup_field option. Link

You’re Serializer class would look something like:

class GameProfileSerializer(serializers.HyperlinkedModelSerializer):
    """ 
    """
    user_pk = serializers.Field(source='user.id')

    class Meta:
        model = GameProfile
        lookup_field = 'user_pk'  # Might have to use 'user__id'
👤patsweet

Leave a comment