Как я могу получить записи (конкретной модели) как 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)
        
Вернуться на верх