【问题标题】:Filtering with DjangoFilterBackend does not found the url用 DjangoFilterBackend 过滤没有找到 url
【发布时间】:2018-12-04 07:05:36
【问题描述】:

我正在使用 Django 休息框架 3.8.2。

我已阅读api-guide/filtering 并遵循DjangoFilterBackend 部分的给定示例。

models.py

class Pregunta(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    name = models.CharField(max_length=512, null=False)
    descripcion = models.CharField(max_length=200, null=False)
    categoria = models.ForeignKey(Pregunta_Categoria, on_delete=models.PROTECT)
    tipoRespuesta = models.ForeignKey(TipoRespuesta, on_delete=models.PROTECT, related_name='fk_id_tipoRespuesta') #sacar el default
    privated = models.BooleanField(default=False)
    status = models.CharField(max_length=1, default='A')
    created_by = models.ForeignKey(User, on_delete=models.PROTECT, related_name='proy_created_by8')
    created_on = models.DateTimeField(default=timezone.now)
    modified_by = models.ForeignKey(User, on_delete=models.PROTECT, related_name='proy_modified_by8')
    modified_on = models.DateTimeField(blank=True, null=True)

    class Meta:
        permissions = (
            ('view_pregunta', 'View Pregunta'),
        )

    def __str__(self):
        return "%s" % (self.name)

    def __unicode__(self):
        return u'%s' % (self.name)

views.py

class PreguntaViewSet(viewsets.ModelViewSet):
    queryset = Pregunta.objects.filter(estado='A')
    serializer_class = PreguntaSerializer
    filter_backends = (DjangoFilterBackend,)
    filter_fields = ('name', 'privated')

这是我的序列化器:

class PreguntaSerializer(serializers.ModelSerializer):
    nom_tipoRespuesta = serializers.CharField(
        source="tipoRespuesta.nombre", required=False, allow_blank=True)

    class Meta:
        model = Pregunta
        fields = (
            'id', 'name', 'descripcion', 'categoria', 'tipoRespuesta',
            'created_by', 'created_on', 'modified_by', 'modified_on',
            'status', 'privated', 'nom_tipoRespuesta',
        )

urls.py

from django.conf.urls import url, include
from rest_framework import routers
from proy import views

router = routers.DefaultRouter()
router.register(r'questions', views.PreguntaViewSet)
router.register(r'questionCategories', views.PreguntaCategoriaViewSet)
router.register(r'projects', views.ProyectoViewSet)
router.register(r'polls', views.EncuestaViewSet)
router.register(r'questionnaire', views.CuestionarioViewSet)
router.register(r'pollByUser', views.EncuestaPorUsuarioViewSet)
router.register(r'answerType', views.TipoRespuestaViewSet)
router.register(r'answers', views.RespuestaViewSet)
router.register(r'answerByUser', views.RespuestaPorUsuarioViewSet)
router.register(r'variablesType', views.TipoVariableViewSet)
router.register(r'variablesCategory', views.CategoriaVariableViewSet)
router.register(r'variables', views.VariableViewSet)

urlpatterns = [
    url(r'^', include(router.urls)),
]

settings.py:

REST_FRAMEWORK = {
    'DEFAULT_PARSER_CLASSES': (
        'rest_framework.parsers.JSONParser',
    ),
    'DEFAULT_PERMISSION_CLASSES': (
        #'rest_framework.permissions.IsAuthenticated',
    ),
    'EXCEPTION_HANDLER': 'adm.exceptions.core_exception_handler',
    'NON_FIELD_ERRORS_KEY': 'error',
    'DEFAULT_FILTER_BACKENDS': (
        'django_filters.rest_framework.DjangoFilterBackend',
    ),
}

但是,当我尝试 url 时

http://example.com/api/questions?name=someName&privated=True

我收到错误Page not found (404)

我做错了什么?

【问题讨论】:

  • 您确定 URL 应该是 example.com/ 吗?您是否在该 URL 中有您的代码,或者您是否在本地 hosts 文件中设置了它?如果没有,你应该检查你的 Django 服务器在哪里监听(可能是127.0.0.1:8000)。
  • example.com/api/questions?name=someName&privated=True 只是一个例子,真正的 url 是localhost:8000/api/v1/questions?name=someName&privated=True @Ralf
  • 其他 URL 是否有效?例如http://localhost:8000/api/v1/questionCategories/http://localhost:8000/api/v1/pools/?您是否在路径中包含正确的版本 (v1/)?
  • @Ralf 是的,其他 URL 有效

标签: django filter django-rest-framework http-status-code-404


【解决方案1】:

默认情况下,DefaultRouter 创建的 URL 会附加一个斜杠,试试这个 url:

http://example.com/api/questions/?name=someName&privated=True

【讨论】:

  • 我试过这个,但它没有检索到任何数据,它显示了一个用于发布、获取数据的 django rest 框架窗口
  • @AngelPineda 看起来您没有 name=someName&privated=True 值的记录。不确定,但我认为 True 应该小写。试试name=someName&privated=true
  • @nerverwalkaloner name=someName&privated=True只是一个例子,我有很多记录
猜你喜欢
  • 2017-04-02
  • 2021-09-03
  • 1970-01-01
  • 1970-01-01
  • 2019-02-03
  • 2020-01-14
  • 2013-09-02
  • 2020-01-28
  • 2018-06-09
相关资源
最近更新 更多