更新: 原来是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
希望这能解决您的问题!
