Как я могу получить записи (конкретной модели) как request.user, так и конкретного пользователя?
Я не очень профессионален в django rest...
Я написал блог с использованием django rest framework и нет никаких проблем, когда я хочу получить все записи, связанные с моделью Article или получить конкретную статью, например
Но что я хочу сделать, так это отправить идентификатор пользователя (или имя пользователя) в представление, когда я нажимаю на имя пользователя.
и в результате отобразить все записи модели Article, относящиеся к request.user и все записи модели Article, относящиеся к пользователю, имя которого было нажато.
Фактически, я хочу щелкнуть по имени каждого пользователя, в дополнение к получению статей этого пользователя, также будут взяты статьи, относящиеся к request.user.
Вот что я сделал на данный момент...
#models.py
class Article(models.Model):
title = models.CharField(max_length=255)
slug = models.SlugField
author = models.ForeignKey(User , on_delete = models.CASCADE)
content = models.TextField(null = True)
publish = models.DateTimeField(default = timezone.now)
created = models.DateTimeField(auto_now_add = True)
updated = models.DateTimeField(auto_now = True)
status = models.BooleanField(default = False)
def __str__(self):
return self.title
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
name = models.CharField(max_length=100)
pic = models.ImageField(upload_to="img", blank=True, null=True)
def __str__(self):
return self.user.username
#views.py
class ArticleCreate(CreateAPIView):
queryset = Article.objects.all()
serializer_class = ArticleSerializer
class ArticleList(ListAPIView):
queryset = Article.objects.all()
serializer_class = ArticleSerializer
class ArticleDetail(RetrieveUpdateDestroyAPIView):
queryset = Article.objects.all()
serializer_class = ArticleSerializer
class UserDetail(RetrieveUpdateDestroyAPIView):
queryset = get_user_model().objects.all()
serializer_class = UserSerializer
class UserProfile(RetrieveUpdateDestroyAPIView):
queryset = Profile.objects.all()
serializer_class = ProfileSerializer
#serializers.py
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = get_user_model()
fields = "__all__"
class ProfileSerializer(serializers.ModelSerializer):
class Meta:
model = Profile
fields = "__all__"
class ArticleSerializer(serializers.ModelSerializer):
class Meta:
model = Article
exclude = ['updated' , 'created']
tnx заранее
views.py
from django.contrib.auth import get_user_model
class CustomArticleList(ListAPIView):
serializer_class = ArticleSerializer
def get_queryset(self):
user_id = self.kwargs.get('user_id')
username = self.kwargs.get('username')
request_user = self.request.user
articles = Article.objects.filter(author=request_user)
if user_id:
user = get_user_model().objects.get(id=user_id)
elif username:
user = get_user_model().objects.get(username=username)
articles |= Article.objects.filter(author=user)
return articles
urls.py
from .views import CustomArticleList
urlpatterns = [
path('articles/<int:user_id>/', CustomArticleList.as_view(), name='custom-article-list'),
path('articles/<str:username>/', CustomArticleList.as_view(), name='custom-article-list'),
# ...
]
Вы должны непосредственно сделать несколько модификаций в методе get_queryset()
с помощью объектов Q
так:
class ArticleList(ListAPIView):
queryset = Article.objects.all()
serializer_class = ArticleSerializer
def get_queryset(self):
user_id = self.kwargs.get('user_id')
if user_id:
articles = Article.objects.filter(Q(author_id=user_id) | Q(author=self.request.user))
return articles
return self.queryset
Вам также потребуется изменить ваш файл urls.py, чтобы включить параметр user_id
в URL так:
from django.urls import path
from .views import ArticleList
urlpatterns = [
path('articles/<int:user_id>/', ArticleList.as_view(), name='article_list'),
# ... Other routes.
]
пример URL: http://example.com/api/purchases?username=denvercoder9
class ArticleList(ListAPIView):
queryset = Article.objects.all()
serializer_class = ArticleSerializer
def get_queryset(self):
username = self.request.query_params.get('username')
if username:
return User.objects.filter(username=username).article_set.all()
user = self.request.user
return Article.objects.filter(author=user)