Skip to main content
 首页 » 编程设计

python之DRF之Django 网址过滤器之RelatedFieldError

2024年09月07日32mfryf

更新: 原来是Django的版本冲突。我使用的是 2.0,因为 DUF 当前版本兼容到 1.11


我正在使用 DUF 作为过滤器后端开发 DRF 通用 ListView 。

你能帮我解决这个错误吗?我确定我在这里做错了与相关领域相关的事情。

当我尝试过滤 url 时,出现以下错误。我想过滤子模型的所有列。

http://127.0.0.1:8000/api/childlist/?customer_id=2 
 
AttributeError at /api/childlist/ 
'OneToOneField' object has no attribute 'rel' 

以下是我目前的工作:

模型.py

from django.db import models 
from django.contrib.auth.models import User 
# Create your models here. 
 
class Parent(models.Model): 
    customer_id = models.BigIntegerField(primary_key=True) 
    customer_name = models.CharField(blank=True, null=True, max_length=50) 
    age = models.IntegerField(blank=True, null=True) 
 
 
class Child(models.Model): 
    customer_id = models.OneToOneField(Parent, on_delete=models.DO_NOTHING, related_name='customer_id_fk_parent') 
    used_by = models.ForeignKey(User, on_delete=models.DO_NOTHING, related_name='rel_user') 
    comments = models.TextField(blank=True,null=True) 

View .py

from rest_framework import generics 
 
from onetoone.models import Child 
from .serializers import Child_Serializer 
from url_filter.integrations.drf import DjangoFilterBackend 
 
 
#Required columns on Child -- All columns 
FILTER_REQ_COLUMNS = [field.name for field in Child._meta.get_fields()] 
 
 
class ChildList(generics.ListAPIView): 
    queryset = Child.objects.all() 
    serializer_class = Child_Serializer 
    filter_backends = [DjangoFilterBackend] 
    filter_fields = FILTER_REQ_COLUMNS 

序列化程序.py

from rest_framework import serializers 
from onetoone.models import Child 
 
 
class Child_Serializer(serializers.ModelSerializer): 
    class Meta: 
        model = Child 
        exclude = [] 

网址.py

path('childlist/', ChildList.as_view(), name='api_child_list'), 

当前列表数据如下

http://127.0.0.1:8000/api/childlist/ 
 
HTTP 200 OK 
Allow: GET, HEAD, OPTIONS 
Content-Type: application/json 
Vary: Accept 
 
{ 
    "count": 3, 
    "next": null, 
    "previous": null, 
    "results": [ 
        { 
            "id": 1, 
            "comments": "1 is in use", 
            "customer_id": 1, 
            "used_by": 1 
        }, 
        { 
            "id": 2, 
            "comments": "2 is in use", 
            "customer_id": 2, 
            "used_by": 1 
        }, 
        { 
            "id": 3, 
            "comments": "3 in use", 
            "customer_id": 3, 
            "used_by": 1 
        } 
    ] 
} 

在要点中添加完整的跟踪。

https://gist.github.com/just10minutes/b9add9c00ee3a14764b324ec30c65344

请您参考如下方法:

我重现了同样的错误,我认为是某种版本不匹配导致了错误。无论如何,我找到了两种避免错误的方法,

方法一
将 django 版本降级到 1.11 (pip install django==1.11.10)

方法二
使用类似的 django 过滤器包,django-filter
1.安装包
2. 添加django_filters到INSTALLED_APPS
3. 如下重新定义您的view.py

from django_filters import rest_framework as filters 
 
FILTER_REQ_COLUMNS = [field.name for field in Child._meta.get_fields()] 
 
 
class ChildList(generics.ListAPIView): 
    queryset = Child.objects.all() 
    serializer_class = Child_Serializer 
    filter_backends = (filters.DjangoFilterBackend,) 
    filter_fields = FILTER_REQ_COLUMNS 



希望这能解决您的问题!