djangfilterbackend不适用于我的模型(许多)

2024-10-06 10:29:59 发布

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

我有一个Django REST项目,其中我使用了Django REST框架过滤器github link中的DjangoFilterBackend。在

这个后端适用于我的一些具有ForeignKey&manytomy关系的模型,但是它不适用于其他一些模型,并且总是给我一个AttributeError: 'NoneType' object has no attribute 'verbose_name'。 我的型号:

from django.db import models
from authuser.models import AbstractUser, BaseUserManager
from corporation.models import Corporation


class Organization(AbstractUser):
    company = models.ForeignKey(Corporation, verbose_name='company',
                            related_name='organizations',
                            null=True, on_delete=models.SET_NULL)
    contact_name = models.CharField(max_length=50, verbose_name='contact_name', default='')
    contact_phone = models.CharField(max_length=50, null=True, verbose_name='contact_phone')
    contact_email = models.EmailField(max_length=50,     verbose_name='contact_email', default='')
    about_us = models.TextField(null=True, verbose_name='about_us')
    info_completed = models.BooleanField(default=False,     verbose_name='info_completed')

    objects = BaseUserManager()

    class Meta:
        ordering = ('date_joined',)

我的观点:

^{pr2}$

我的过滤器集:

class OrganizationFilter(filters.FilterSet):
    company = filters.RelatedFilter(CorporationFilter, name='company')
    description = filters.AllLookupsFilter(name='description')
    contact_name = filters.AllLookupsFilter(name='contact_name')
    contact_phone = filters.AllLookupsFilter(name='contact_phone')
    contact_email = filters.AllLookupsFilter(name='contact_email')

    class Meta:
        model = Organization
        fields = (
            'company',
            'description', 'contact_name', 'contact_phone',
            'contact_email',
        )

我的序列化程序:

class OrganizationSerializer(serializers.ModelSerializer):
    company = serializers.PrimaryKeyRelatedField(queryset=Corporation.objects.all())

    class Meta:
        model = Organization
        fields = ('id', 'company',
                  'contact_name', 'contact_email',
                  'contact_phone', 'info_completed')

积垢情况良好。它只是给我列出组织时的属性错误:

Creating test database for alias 'default'...
E.........
======================================================================
ERROR: test_list_organizations (organization.tests.SimpleTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "F:\landi-django\organization\tests.py", line 73, in test_list_organizati
ons
    response = client.get('/organizations?contact_name=Tingtao')
  File "F:\landi-django\env\lib\site-packages\rest_framework\test.py", line 160,
 in get
    response = super(APIClient, self).get(path, data=data, **extra)
  File "F:\landi-django\env\lib\site-packages\rest_framework\test.py", line 86,
in get
    return self.generic('GET', path, **r)
  File "F:\landi-django\env\lib\site-packages\rest_framework\compat.py", line 18
9, in generic
    return self.request(**r)
  File "F:\landi-django\env\lib\site-packages\rest_framework\test.py", line 157,
 in request
    return super(APIClient, self).request(**kwargs)
  File "F:\landi-django\env\lib\site-packages\rest_framework\test.py", line 109,
 in request
    request = super(APIRequestFactory, self).request(**kwargs)
  File "F:\landi-django\env\lib\site-packages\django\test\client.py", line 440,
in request
    six.reraise(*exc_info)
  File "F:\landi-django\env\lib\site-packages\django\core\handlers\base.py", lin
e 111, in get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "F:\landi-django\env\lib\site-packages\django\views\decorators\csrf.py",
line 57, in wrapped_view
    return view_func(*args, **kwargs)
  File "F:\landi-django\env\lib\site-packages\django\views\generic\base.py", lin
e 69, in view
    return self.dispatch(request, *args, **kwargs)
  File "F:\landi-django\env\lib\site-packages\rest_framework\views.py", line 407
, in dispatch
    response = self.handle_exception(exc)
  File "F:\landi-django\env\lib\site-packages\rest_framework\views.py", line 404
, in dispatch
    response = handler(request, *args, **kwargs)
  File "F:\landi-django\env\lib\site-packages\rest_framework\generics.py", line
311, in get
    return self.list(request, *args, **kwargs)
  File "F:\landi-django\env\lib\site-packages\rest_framework\mixins.py", line 40
, in list
    instance = self.filter_queryset(self.get_queryset())
  File "F:\landi-django\env\lib\site-packages\rest_framework\generics.py", line
144, in filter_queryset
    queryset = backend().filter_queryset(self.request, queryset, self)
  File "F:\landi-django\env\lib\site-packages\rest_framework_filters\backends.py
", line 45, in filter_queryset
    _filter = filter_class(request.QUERY_PARAMS, queryset=queryset)
  File "F:\landi-django\env\lib\site-packages\rest_framework_filters\filterset.p
y", line 61, in __init__
    f = self.filter_for_field(field, filter_.name)
  File "F:\landi-django\env\lib\site-packages\django_filters\filterset.py", line
 400, in filter_for_field
    'label': capfirst(f.verbose_name),
AttributeError: 'NoneType' object has no attribute 'verbose_name'

----------------------------------------------------------------------

我还试着在django_过滤器中注释第400行\过滤器集.py,但它给了我更多的错误。 非常感谢你的帮助!在


Tags: djangonameinpyselfenvrestrequest
1条回答
网友
1楼 · 发布于 2024-10-06 10:29:59

在您的OrganizationFilter上,您正在定义一个description字段,该字段可用于筛选Organization对象。但是,description字段在Organization模型上不存在,因此django filter无法基于该字段过滤queryset。您似乎有一个about_us字段,我猜这正是您要使用的。在

您可以通过将OrganizationFilter上的字段重命名为about_us,或者将description字段上的name设置为about_us,因此django filter将使用该字段。在

class OrganizationFilter(filters.FilterSet):
    company = filters.RelatedFilter(CorporationFilter, name='company')
    about_us = filters.AllLookupsFilter(name='about_us')
    contact_name = filters.AllLookupsFilter(name='contact_name')
    contact_phone = filters.AllLookupsFilter(name='contact_phone')
    contact_email = filters.AllLookupsFilter(name='contact_email')

    class Meta:
        model = Organization
        fields = (
            'company',
            'description', 'contact_name', 'contact_phone',
            'contact_email',
        )

这些更改中的任何一个都可以使它正常工作而不会引发错误。在

相关问题 更多 >