Получение экземпляра модели путем передачи имени поля, а не первичного идентификатора - PullRequest
1 голос
/ 25 февраля 2020

Я хочу получить экземпляр модели, используя URL-адрес как http://127.0.0.1: 8000 / db / User / email (т.е. используя электронную почту в качестве запроса), а не http://127.0.0.1: 8000 / дб / User / 1 / . Как подойти к этому.

Модель:

class Employee(models.Model):
    firstname = models.CharField(max_length=100)
    email = models.CharField(max_length=100)

serializers.py

class EmployeeSerializers(serializers.ModelSerializer):
    field = NestedSerializers()

    class Meta:
        model = Employee
        fields = '__all__'

    def create(self, validated_data):
        #overwrite this method for writable nested serializers. 

view.py:

class UserView(viewsets.ModelViewSet):
    queryset = Employee.objects.all()
    serializer_class = EmployeeSerializers

urls.py:

router = routers.DefaultRouter()
router.register('User', views.UserView)

urlpatterns = [
    path('', views.index, name='index'),
    path('/', include(router.urls))
]

Можно ли это сделать с помощью ModelViewSet?

1 Ответ

0 голосов
/ 25 февраля 2020

Я вижу, вы используете DRF viewset. Если вы когда-нибудь захотите использовать только электронную почту, а не идентификатор, вы можете переопределить функцию извлечения набора: например,

from django.shortcuts import get_object_or_404

class UserView(viewsets.ModelViewSet):
    queryset = Employee.objects.all()
    serializer_class = EmployeeSerializers        

    def retrieve(self, request):
        employee = get_object_or_404(
                      self.queryset,
                      email=self.kwargs['email']
        )
        serializer = self.serializer_class(employee)
        return Response(serializer.data)

urls

    router = routers.DefaultRouter()
    router.register('^User/(?P<email>.+)/$', views.UserView)

    urlpatterns = [
        path('', views.index, name='index'),
        path('/', include(router.urls))
    ]

извлечение - это уже функциональность предоставляется в классе viewset

...