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

Django 通过传递字段名而不是主ID获取模型实例,django,django-views,django-urls,Django,Django Views,Django Urls,我希望使用URL作为(即使用电子邮件作为查询)而不是通过获取模型实例。如何处理这个问题 型号: class Employee(models.Model): firstname = models.CharField(max_length=100) email = models.CharField(max_length=100) 序列化程序.py class EmployeeSerializers(serializers.ModelSerializer): field =

我希望使用URL作为(即使用电子邮件作为查询)而不是通过获取模型实例。如何处理这个问题

型号:

class Employee(models.Model):
    firstname = models.CharField(max_length=100)
    email = models.CharField(max_length=100)
序列化程序.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
URL.py:

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

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


可以使用ModelViewSet吗?

我知道您正在使用DRF viewset。如果您只想使用电子邮件而不想使用id,则可以覆盖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)
网址

router=routers.DefaultRouter()
路由器.register(“^User/(?P.+)/$”,views.UserView)
URL模式=[
路径(“”,views.index,name='index'),
路径(“/”,包括(router.url))
]

检索是viewset类中已经提供的功能,我知道您正在使用DRF viewset。如果您只想使用电子邮件而不想使用id,则可以覆盖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)
网址

router=routers.DefaultRouter()
路由器.register(“^User/(?P.+)/$”,views.UserView)
URL模式=[
路径(“”,views.index,name='index'),
路径(“/”,包括(router.url))
]

取回功能已经在viewset类中提供了

如果我想将电子邮件作为一个查询,该怎么办?这将有助于尝试一下!我使用的URL为127.0.0.1:8000/db/User/xyz@abc.com. 它与URLconf不匹配我是否需要更改URL模式。啊,是的,抱歉写得太快了。您需要将电子邮件作为参数传递,这是对url配置的更改。让我很快更新我的答案!我也意识到你在你的URLCONF中使用了一个U,应该考虑更新到小写,如果我想把电子邮件作为一个查询,那该怎么办呢?我使用的URL为127.0.0.1:8000/db/User/xyz@abc.com. 它与URLconf不匹配我是否需要更改URL模式。啊,是的,抱歉写得太快了。您需要将电子邮件作为参数传递,这是对url配置的更改。让我很快更新我的答案!我也意识到你在你的URLCONF中使用了一个资本U,应该考虑更新到小写字母U。