Django 通过传递字段名而不是主ID获取模型实例
我希望使用URL作为(即使用电子邮件作为查询)而不是通过获取模型实例。如何处理这个问题 型号: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 =
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。