drf-nested-routers icon indicating copy to clipboard operation
drf-nested-routers copied to clipboard

NestedHyperlinkedIdentityField add parameter null for return None if attribute not found in object

Open aztecrabbit opened this issue 5 years ago • 1 comments

Model

class Person(models.Model):
    child = models.ForeignKey('Person', on_delete=models.SET_NULL, null=True)

Serializer

class PersonSerializer(NestedHyperlinkedModelSerializer):
    child = NestedHyperlinkedIdentityField(
        view_name='person-detail',
        parent_lookup_kwargs={
            'pk': 'child__pk',
        },
    )

    class Meta:
        model = Person
        fields = '__all__'

I want child is None if child object is None, instead of raise AttributeError: 'NoneType' object has no attribute 'pk'

aztecrabbit avatar Jun 01 '20 12:06 aztecrabbit

There is no problem when tested as below. Give me more information.

serializer

class AddressSerializer(NestedHyperlinkedModelSerializer):
    user = NestedHyperlinkedIdentityField(
        view_name='user-detail',
        parent_lookup_kwargs={
            'user_pk': 'user__pk',
        },
    )
    class Meta:
        model = Address
        fields = '__all__'

model

class Address(models.Model):
    id = models.BigAutoField(primary_key=True)
    user = models.ForeignKey(
        User, on_delete=models.SET_NULL, related_name='addresses', null=True)

view

class AddressViewSet(viewsets.ModelViewSet):
    serializer_class = AddressSerializer

    def get_queryset(self):
        return Address.objects.filter(user=self.kwargs['user_pk'])

url

domains_router = routers.NestedSimpleRouter(router, r'users', lookup='user', trailing_slash=False)
domains_router.register(r'addresses', AddressViewSet, basename='user-address')

gongul avatar Jan 27 '21 07:01 gongul