Django rest框架的StringRelatedField正在抛出KeyError

2024-09-20 04:12:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下模型类

class Categories(models.Model):
    id = models.UUIDField(primary_key=True, auto_created=True, default=uuid.uuid4, unique=True)
    business = models.ForeignKey(Business, related_name='category_business', on_delete=models.CASCADE)
    name = models.CharField(max_length=128)

    class Meta:
        unique_together = ('business', 'name')


class Menu(models.Model):
    id = models.UUIDField(primary_key=True, auto_created=True, default=uuid.uuid4, unique=True)
    business = models.ForeignKey(Business, related_name='menu_business', on_delete=models.CASCADE)
    name = models.CharField(max_length=128)
    description = models.CharField(max_length=128)
    category = models.ForeignKey(Categories, related_name='menus', on_delete=models.CASCADE)
    price = models.IntegerField()

    class Meta:
        unique_together = ('business', 'name', 'category')

    def __str__(self):
        return '%s %s %s' % (self.name, self.price, self.description)

我已经导入了这些类,如下所示,因为它们位于一个单独的包中

Categories = apps.get_model('business', 'Categories')
Menu = apps.get_model('business', 'Menu')

这是我的序列化程序类

class GetCategoriesSerializer(serializers.ModelSerializer):
    menus = serializers.StringRelatedField(many=True)

    class Meta:
        model = Categories
        fields = ('name', 'menus')

而观点是

class GetCategories(generics.ListAPIView):
    """
    Returns a list of businesses to the user. It'd read only and no authentication is needed
    """
    permission_classes = [ReadOnly]
    queryset = Categories.objects.values()
    serializer_class = GetCategoriesSerializer

url有以下内容

path('customer/<str:pk>/categories', GetCategories.as_view()),

我得到以下错误

Traceback (most recent call last):
  File "/Users/mymac/myapp/mytestapp/venv/lib/python3.7/site-packages/django/core/handlers/exception.py", line 34, in inner
    response = get_response(request)
  File "/Users/mymac/myapp/mytestapp/venv/lib/python3.7/site-packages/django/core/handlers/base.py", line 115, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/Users/mymac/myapp/mytestapp/venv/lib/python3.7/site-packages/django/core/handlers/base.py", line 113, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/Users/mymac/myapp/mytestapp/venv/lib/python3.7/site-packages/django/views/decorators/csrf.py", line 54, in wrapped_view
    return view_func(*args, **kwargs)
  File "/Users/mymac/myapp/mytestapp/venv/lib/python3.7/site-packages/django/views/generic/base.py", line 71, in view
    return self.dispatch(request, *args, **kwargs)
  File "/Users/mymac/myapp/mytestapp/venv/lib/python3.7/site-packages/rest_framework/views.py", line 505, in dispatch
    response = self.handle_exception(exc)
  File "/Users/mymac/myapp/mytestapp/venv/lib/python3.7/site-packages/rest_framework/views.py", line 465, in handle_exception
    self.raise_uncaught_exception(exc)
  File "/Users/mymac/myapp/mytestapp/venv/lib/python3.7/site-packages/rest_framework/views.py", line 476, in raise_uncaught_exception
    raise exc
  File "/Users/mymac/myapp/mytestapp/venv/lib/python3.7/site-packages/rest_framework/views.py", line 502, in dispatch
    response = handler(request, *args, **kwargs)
  File "/Users/mymac/myapp/mytestapp/venv/lib/python3.7/site-packages/rest_framework/generics.py", line 199, in get
    return self.list(request, *args, **kwargs)
  File "/Users/mymac/myapp/mytestapp/venv/lib/python3.7/site-packages/rest_framework/mixins.py", line 48, in list
    return Response(serializer.data)
  File "/Users/mymac/myapp/mytestapp/venv/lib/python3.7/site-packages/rest_framework/serializers.py", line 760, in data
    ret = super().data
  File "/Users/mymac/myapp/mytestapp/venv/lib/python3.7/site-packages/rest_framework/serializers.py", line 260, in data
    self._data = self.to_representation(self.instance)
  File "/Users/mymac/myapp/mytestapp/venv/lib/python3.7/site-packages/rest_framework/serializers.py", line 678, in to_representation
    self.child.to_representation(item) for item in iterable
  File "/Users/mymac/myapp/mytestapp/venv/lib/python3.7/site-packages/rest_framework/serializers.py", line 678, in <listcomp>
    self.child.to_representation(item) for item in iterable
  File "/Users/mymac/myapp/mytestapp/venv/lib/python3.7/site-packages/rest_framework/serializers.py", line 516, in to_representation
    attribute = field.get_attribute(instance)
  File "/Users/mymac/myapp/mytestapp/venv/lib/python3.7/site-packages/rest_framework/relations.py", line 529, in get_attribute
    relationship = get_attribute(instance, self.source_attrs)
  File "/Users/mymac/myapp/mytestapp/venv/lib/python3.7/site-packages/rest_framework/fields.py", line 92, in get_attribute
    instance = instance[attr]
Exception Type: KeyError at /customer/85f44d20-f936-4940-8e15-01393e42c4a8/categories
Exception Value: 'menus'

我研究了DRF示例,这似乎是一件简单的事情。 https://www.django-rest-framework.org/api-guide/relations/#api-reference

但我在这一点上有点卡住了。我做错什么了吗?提前感谢您的帮助


Tags: inpyselfrestvenvmodelslibpackages
1条回答
网友
1楼 · 发布于 2024-09-20 04:12:04

您应该使用QuerySet而不是ValueQuerySet。也就是说,使用

^{pr1}$而不是^{pr 2}$

因此,将视图的queryset属性更改为

class GetCategories(generics.ListAPIView):
    permission_classes = [ReadOnly]
    queryset = Categories.objects.all()
    serializer_class = GetCategoriesSerializer

相关问题 更多 >