【发布时间】: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