Django:FieldError:无法将关键字“用户名”解析为字段

时间:2020-07-25 06:08:18

标签: python django django-models django-rest-framework django-views

我正在建立一个网站。我的网站上有两个应用程序-“帐户”和“文章”。我正在尝试创建一个用户视图,当按用户名搜索时,该视图将返回该特定用户创作的所有文章。 这些模型是:

articles.models.py

class Article(models.Model):
    title = models.CharField(max_length=120)
    content = models.TextField()
    uploads = models.FileField(blank=True, null=True, upload_to='uploads/')
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    author = models.ForeignKey(
        settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='articles')
    clappers = models.ManyToManyField(
        settings.AUTH_USER_MODEL, related_name="claps", blank=True)
    slug = models.SlugField(max_length=120, unique=True)
    is_anonymous = models.BooleanField(default=False)

    def save(self, *args, **kwargs):
        self.slug = get_unique_slug(self.id, self.title, Article.objects)
        return super(Article, self).save(*args, **kwargs)


def get_unique_slug(id, title, obj):
    slug = slugify(title.replace('ı', 'i'))
    unique_slug = slug
    counter = 1
    while obj.filter(slug=unique_slug).exists():
        if(obj.filter(slug=unique_slug).values('id')[0]['id'] == id):
            break
        unique_slug = '{}-{}'.format(slug, counter)
        counter += 1
    return unique_slug

accounts.models.py文件:

class User(AbstractUser):
    username = models.CharField(max_length=120, unique=True)
    email = models.EmailField(unique=True)
    phone = models.CharField(max_length=10)
    avatar = models.ImageField(blank=True, null=True)
    bio = models.CharField(max_length=250, blank=True, null=True)
    slug = models.SlugField(max_length=120, unique=True)

    def get_username(self):
        return self.username

    def save(self, *args, **kwargs):
        self.slug = get_unique_slug(self.id, self.username, User.objects)
        return super(User, self).save(*args, **kwargs)

    def __str__(self):
        return self.username


def get_unique_slug(id, title, obj):
    slug = slugify(title.replace('ı', 'i'))
    unique_slug = slug
    counter = 1
    while obj.filter(slug=unique_slug).exists():
        if(obj.filter(slug=unique_slug).values('id')[0]['id'] == id):
            break
        unique_slug = '{}-{}'.format(slug, counter)
        counter += 1
    return unique_slug

这是我的account.articles.py文件:


class UserAPIView(generics.RetrieveUpdateAPIView):
    serializer_class = UserSerializer
    permission_classes = [IsUserOrReadOnly]
    lookup_field = 'username'

    def get_queryset(self):
        author = self.kwargs.get("username")
        print(author)
        # double __
        return Article.objects.filter(author__username=author).order_by("-created_at")

和urls.py文件:


urlpatterns = [
    path('', include('rest_auth.urls')),
    path('registration/', include('rest_auth.registration.urls')),
    path('user/<str:username>/', UserAPIView.as_view(), name='account-view')
]

可能是什么问题?那有什么解决方案?

编辑:错误日志:

Internal Server Error: /api/auth/user/admin12/
Traceback (most recent call last):
  File "E:\Anaconda\envs\myDjangoEnv\lib\site-packages\django\core\handlers\exception.py", line 34, in inner
    response = get_response(request)
  File "E:\Anaconda\envs\myDjangoEnv\lib\site-packages\django\core\handlers\base.py", line 115, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "E:\Anaconda\envs\myDjangoEnv\lib\site-packages\django\core\handlers\base.py", line 113, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "E:\Anaconda\envs\myDjangoEnv\lib\site-packages\django\views\decorators\csrf.py", line 54, in wrapped_view
    return view_func(*args, **kwargs)
  File "E:\Anaconda\envs\myDjangoEnv\lib\site-packages\django\views\generic\base.py", line 71, in view
    return self.dispatch(request, *args, **kwargs)
  File "E:\Anaconda\envs\myDjangoEnv\lib\site-packages\rest_framework\views.py", line 505, in dispatch
    response = self.handle_exception(exc)
  File "E:\Anaconda\envs\myDjangoEnv\lib\site-packages\rest_framework\views.py", line 465, in handle_exception
    self.raise_uncaught_exception(exc)
  File "E:\Anaconda\envs\myDjangoEnv\lib\site-packages\rest_framework\views.py", line 476, in raise_uncaught_exception
    raise exc
  File "E:\Anaconda\envs\myDjangoEnv\lib\site-packages\rest_framework\views.py", line 502, in dispatch
    response = handler(request, *args, **kwargs)
  File "E:\Anaconda\envs\myDjangoEnv\lib\site-packages\rest_framework\generics.py", line 252, in get
    return self.retrieve(request, *args, **kwargs)
  File "E:\Anaconda\envs\myDjangoEnv\lib\site-packages\rest_framework\mixins.py", line 54, in retrieve
    instance = self.get_object()
  File "E:\Anaconda\envs\myDjangoEnv\lib\site-packages\rest_framework\generics.py", line 96, in get_object
    obj = get_object_or_404(queryset, **filter_kwargs)
  File "E:\Anaconda\envs\myDjangoEnv\lib\site-packages\rest_framework\generics.py", line 19, in get_object_or_404
    return _get_object_or_404(queryset, *filter_args, **filter_kwargs)
  File "E:\Anaconda\envs\myDjangoEnv\lib\site-packages\django\shortcuts.py", line 76, in get_object_or_404
    return queryset.get(*args, **kwargs)
  File "E:\Anaconda\envs\myDjangoEnv\lib\site-packages\django\db\models\query.py", line 404, in get
    clone = self._chain() if self.query.combinator else self.filter(*args, **kwargs)
  File "E:\Anaconda\envs\myDjangoEnv\lib\site-packages\django\db\models\query.py", line 904, in filter
    return self._filter_or_exclude(False, *args, **kwargs)
  File "E:\Anaconda\envs\myDjangoEnv\lib\site-packages\django\db\models\query.py", line 923, in _filter_or_exclude
    clone.query.add_q(Q(*args, **kwargs))
  File "E:\Anaconda\envs\myDjangoEnv\lib\site-packages\django\db\models\sql\query.py", line 1350, in add_q
    clause, _ = self._add_q(q_object, self.used_aliases)
  File "E:\Anaconda\envs\myDjangoEnv\lib\site-packages\django\db\models\sql\query.py", line 1377, in _add_q
    child_clause, needed_inner = self.build_filter(
  File "E:\Anaconda\envs\myDjangoEnv\lib\site-packages\django\db\models\sql\query.py", line 1250, in build_filter
    lookups, parts, reffed_expression = self.solve_lookup_type(arg)
  File "E:\Anaconda\envs\myDjangoEnv\lib\site-packages\django\db\models\sql\query.py", line 1087, in solve_lookup_type
    _, field, _, lookup_parts = self.names_to_path(lookup_splitted, self.get_meta())
  File "E:\Anaconda\envs\myDjangoEnv\lib\site-packages\django\db\models\sql\query.py", line 1482, in names_to_path
    raise FieldError("Cannot resolve keyword '%s' into field. "
django.core.exceptions.FieldError: Cannot resolve keyword 'username' into field. Choices are: author, author_id, clappers, content, created_at, id, is_anonymous, slug, title, updated_at, uploads

EDIT2: 进行以下更改后,即使我有一个带有文章的User模型实例,该API似乎也可以正常工作,但返回了404。

class UserAPIView(generics.RetrieveUpdateAPIView):
    serializer_class = ArticleSerializer
    permission_classes = [IsUserOrReadOnly]
    lookup_field = 'author'

    def get_queryset(self, **kwargs):
        author = self.kwargs.get('author')
        print(author)
        # double __
        return Article.objects.filter(author__username=author).order_by("-created_at")

urls.py

path('user/<str:author>/', UserAPIView.as_view(), name='account-view')

2 个答案:

答案 0 :(得分:0)

view内部,您使用了错误的序列化程序。

class UserAPIView(generics.ListAPIView):
    serializer_class = ArticleSerializer
    permission_classes = [IsUserOrReadOnly]

    def get_queryset(self):
        author = self.kwargs.get('username')
        print(author)
        # double __
        return Article.objects.filter(author__username=author).order_by("-created_at")

创建一个ArticleSerializer并将其替换为UserSerializer,应该没问题。 还要删除查找字段。

编辑:使用generics.ListAPIViewviewsets.ModelViewSet

答案 1 :(得分:-1)

好的。我不知道为什么我的编辑不起作用。当我尝试打印返回的queryset时,它确实返回了Article对象。但是,我无法获得该对象的JSON响应。

我尝试将其更改为Viewset,并且有效。

class UserAPIView(viewsets.ModelViewSet):
    queryset = Article.objects.all()
    serializer_class = ArticleSerializer
    permission_classes = [IsUserOrReadOnly]
    lookup_field = 'author'

    def get_queryset(self, **kwargs):
        author = self.kwargs.get('author')
        print(author)
        # double __
        qs = Article.objects.filter(
            author__username=author).order_by("-created_at")
        return qs