通过传递字段名称而不是主 ID 来获取模型实例

Getting model instance by passing field name and not primary ID

我想使用 URL 作为 http://127.0.0.1:8000/db/User/email (i.e. using email as a query) and not by http://127.0.0.1:8000/db/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 吗?

我看到您正在使用 DRF 视图集。如果您只想使用电子邮件而不是 ID,那么您可以像这样覆盖视图集的检索功能:

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)

网址

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

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

检索是视图集中已提供的功能 class