Как получить все сообщения от сообществ, к которым присоединился пользователь в Django REST - PullRequest
0 голосов
/ 13 октября 2019

Итак, у меня есть модель User, модель Community, модель Post и модель UserJoinedCommunity. Что я хочу сделать, так это получить все сообщения от сообществ, к которым присоединился пользователь, чтобы я мог отображать их на домашней странице.

Модель UserJoinedCommunity, которая контролирует, какой пользователь присоединился к какому сообществу:

class UserJoinedCommunity(models.Model):
    """DB Model for users joined communities"""
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    community = models.ForeignKey(Community, on_delete=models.CASCADE)

    class Meta:
        constraints = [
            UniqueConstraint(fields=['user', 'community'], name="user-joined-community")
        ]

    def __str__(self):
        return f"{self.user.username}|{self.community.name}"

Модели Community и Post - это просто простые модели с полями, такими как имя, заголовок и т. Д.

Итак, теперь я хотел бы создать APIView или ViewSet, который бы возвращал все сообщения от сообществ, к которым присоединился пользователь.

Примерно так:

class UserRelevantPosts(APIView):
    authentication_classes = (TokenAuthentication,)

    def get(self, request):
        user_relevant_posts = "?"
        return Response({'posts': user_relevant_posts}, status=200)

Скажите, если вам нужно больше примеров кода.

1 Ответ

1 голос
/ 13 октября 2019

Я думаю, у сообщества есть поле ManyToMany для Post. Если нет, я рекомендую добавить его

class Comunity(models.Model):
    # some fields
    post = models.ManyToManyField(Post)
from models import UserJoinedCommunity
class UserRelevantPosts(APIView):
    authentication_classes = (TokenAuthentication,)

    def get(self, request):
        user = request.data['user'] # you receive the id of user
        user_relevant_posts = {} # dict to return
        # str(item.community) We pass the community name as a key
        # str is to convert it to string
        for item in UserJoinedCommunity.objects.filter(user=user).all():
            user_relevant_posts[str(item.community)] = item.community.post.all().values() 
        return Response({'posts': user_relevant_posts}, status=200)

Вывод:

{
    "post": {
        "community1": [
            {
                "id": 1,
                "name": "post1"
            }
        ],
        "community2": [
            {
                "id": 2,
                "name": "post2"
            },
            {
                "id": 3,
                "name": "post3"
            }
        ]
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...