简体   繁体   English

api 调用方法和viewset

[英]api call method and viewset

I try to create a api call:我尝试创建一个 api 电话:

class CategoryViewSet(viewsets.ModelViewSet):
    serializer_class = CategorySerializer
    queryset = Category.objects.all() 
    
    @action(methods=['get'], detail=False)
    def mainGroups(self,request):        
        mainGroups = Category.objects.filter(category_id__isnull=True) 
        serializer = self.get_serializer_class()(mainGroups)
        
        return Response(serializer.data)

serializer:序列化程序:

class CategorySerializer(serializers.ModelSerializer):
    animals = AnimalSerializer(many=True)
    
    class Meta:
        model = Category
        fields = ['id','category_id','name', 'description', 'animals']

So the main url works: http://127.0.0.1:8000/djangoadmin/groups/所以主要的 url 工作: http://127.0.0.1:8000/djangoadmin/groups/

But if I go to: http://127.0.0.1:8000/djangoadmin/groups/maingGroups/但是如果我 go 到: http://127.0.0.1:8000/djangoadmin/groups/maingGroups/

I get this error:我收到此错误:


AttributeError at /djangoadmin/groups/mainGroups/

Got AttributeError when attempting to get a value for field `name` on serializer `CategorySerializer`.
The serializer field might be named incorrectly and not match any attribute or key on the `QuerySet` instance.
Original exception text was: 'QuerySet' object has no attribute 'name'.

urls.py:网址.py:

router = routers.DefaultRouter()
router.register('groups', CategoryViewSet)   


urlpatterns = [
    path('', include(router.urls))
]

and urls.py of admin looks:管理员的 urls.py 看起来:

from django.contrib import admin
from django.urls import path, include


urlpatterns = [
    path("djangoadmin/", include('djangoadmin.urls')),
    path("admin/", admin.site.urls),   
    
]

Category model:类别 model:

class Category(models.Model):
    name = models.CharField(max_length=100)
    slug = models.SlugField(max_length=100)
    description = models.TextField(max_length=1000)
    images = models.ImageField(upload_to="photos/categories")
    category = models.ForeignKey(
        "Category", on_delete=models.CASCADE, related_name='part_of', blank=True, null=True)
    date_create = models.DateTimeField(auto_now_add=True)
    date_update = models.DateTimeField(auto_now=True)

    class Meta:
        verbose_name = "category"
        verbose_name_plural = "categories"

    def __str__(self):
        return self.name

Question: how to create api method in main url?问题:如何在main url中创建api方法?

I think your problem is with how you are instantiating your serializer class. When you are saying:我认为您的问题在于如何实例化序列化器 class。当您说:

    @action(methods=['get'], detail=False)
    def mainGroups(self,request):        
        mainGroups = Category.objects.filter(category_id__isnull=True) 
        serializer = self.get_serializer_class()(mainGroups)
        
        return Response(serializer.data)

The many parameter, when looking at your error message, seems to be defaulting to False , whereas you want to serialize many of these objects. many参数在查看错误消息时似乎默认为False ,而您想序列化其中的许多对象。

I would change the instantiation to:我会将实例化更改为:

    @action(methods=['get'], detail=False)
    def mainGroups(self,request):        
        mainGroups = Category.objects.filter(category_id__isnull=True) 
        serializer = self.get_serializer(mainGroups, many=True)
        
        return Response(serializer.data)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM