【问题标题】:Django: FieldError: Cannot resolve keyword 'username' into fieldDjango:FieldError:无法将关键字“用户名”解析为字段
【发布时间】:2020-11-14 23:49:25
【问题描述】:

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

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

这是我的 accounts.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

编辑2: 进行以下更改后,API 似乎可以正常工作,但返回 404,即使我有一个包含文章的 User 模型实例。

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')

【问题讨论】:

  • 你能显示你的错误日志吗?如果我们不知道错误出现在哪里,就很难说出您的问题。
  • @crimsonpython24 我添加了错误日志
  • 你不应该使用 ArticleSerializer 而不是 UserSerializer
  • @neferpitou 我将其更改为 ArticleSerializer,给出相同的错误。

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


【解决方案1】:

在您的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

【讨论】:

  • 即使在更改为 ArticleSerializer 后,它也会以某种方式留下相同的错误
  • 检查我删除了lookup字段的编辑。只有一件事如何通过username?它会检查登录用户吗?
  • 不。它根据传递的 URL 返回视图。当用户名扩展名与 URL 一起传递时:user/username/,我希望它返回该特定作者的文章。
  • self.kwargs.get('username') 也应该有效;不通过**kwargs
  • 非常感谢您的帮助。取得了一些进展,我对我的问题进行了第二次编辑。 API 似乎可以正常工作,但是即使存在与文章关联的用户实例,它也会返回 404。我尝试了您建议的所有其他方法,我所做的编辑是唯一有效的编辑。
【解决方案2】:

好的。我不知道为什么我的编辑不起作用。当我尝试打印返回的查询集时,它确实返回了一个 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

【讨论】:

    猜你喜欢
    • 2011-06-09
    • 1970-01-01
    • 2020-08-06
    • 2018-11-23
    • 2021-02-06
    • 1970-01-01
    • 1970-01-01
    • 2021-09-17
    • 2015-01-26
    相关资源
    最近更新 更多