Django запрос базы данных и добавление пользователей в указанную c группу объектов - PullRequest
1 голос
/ 04 мая 2020

Я пытаюсь запросить модель блога так, чтобы она возвращала количество лайков для сообщения блога с title = example и name = something

class Post(models.Model):

    title = models.CharField(max_length=20)
    name = models.CharField(max_length=100)
    content = models.CharField(max_length=100)
    likes = models.ManyToManyField(User, blank=True, related_name='likes')

, сейчас я пытаюсь получить количество лайков в моей модели с этим методом:

   def average_voting(self):
        likes = Post.objects.filter(title=self.title,name=self.name).likes.count()
        return likes

и для добавления пользователя я использую:

Post.objects.filter(title="example",name="something").likes.add(User)

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

РЕДАКТИРОВАТЬ В основном для l oop, который будет делать это будет:

counter = 0
for c in Post.objects.filter(title=self.title,name=self.name):
    counter+=c.likes.count()

Мое намерение состоит в том, чтобы, когда пользователю понравился пост с одинаковым заголовком, независимо от того, кто добавил пост, количество лайков по всем постам с одинаковым заголовком изменится.

Мне также было интересно, как я могу проверить, существует ли пользователь в сообщении, могу ли я использовать:

Post.objects.get(title=self.title,name=self.name).likes.filter(users=user.id).exists():

Если в моей модели пользователя у меня есть отношение ко многим ко многим, например:

posts = models.ManyToManyField('home.Post',related_name='profiles')

, поэтому я пытаюсь понять, понравился ли пользователю пост с таким заголовком.

1 Ответ

2 голосов
/ 04 мая 2020

Вы можете посчитать количество лайков с помощью:

class Post(models.Model):
    title = models.CharField(max_length=20)
    name = models.CharField(max_length=100)
    content = models.CharField(max_length=100)
    likes = models.ManyToManyField(User, blank=True, related_name='likes')

    def num_likes(self):
        return self<b>.likes.count()</b>

. Для добавления нового лайка вы снова не можете использовать .filter(), так как это приведет к коллекции Post объектов. Вы должны использовать .get(..):

Post.objects<b>.get(title='example', name='something')</b>.likes.add(<b>myuser</b>)

РЕДАКТИРОВАТЬ : Если существует несколько Post с одним заголовком, вы можете запросить с помощью:

def num_likes(self):
    return <b>Post.likes.through.objects</b>.filter(post__title=self.title, post__name=self.name).count()

Или вы можете проверить, существует ли пользователь в лайках с помощью:

return Post.likes.through.objects.filter(
    post__title=self.title,
    post__name=self.name,
    <b>user=myuser</b>
).exists()
...