我正在建立一个网站。我的网站上有两个应用程序-“帐户”和“文章”。我正在尝试创建一个用户视图,当按用户名搜索时,该视图将返回该特定用户创作的所有文章。 这些模型是:
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')
答案 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.ListAPIView
或viewsets.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