Django следует особенность с m2m - PullRequest
0 голосов
/ 10 января 2019

Я попытался решить проблему и застрял. Проблема в том, что у меня есть пост, за которым я могу следить. Моя проблема в том, что я не знаю, как добавить кнопку отслеживания. Должно ли это быть сделано по URL, с целью? Или это должно быть скорее как метод в модели?

Моя проблема также в том, правильно ли она написана в терминах моделей - с использованием промежуточной модели Follower?

Вот модель Post, и я хотел бы добавить сюда подписчиков. Я имею в виду, что каждый, кто заинтересован, может следить за этим сообщением

class Post(models.Model):
    owner = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='posts')
    title = models.CharField(max_length=255, unique=True)
    description = models.TextField(max_length=1024)
    followers = models.ManyToManyField(settings.AUTH_USER_MODEL, through='Follower', blank=True)
    is_visible = models.BooleanField(default=True)
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse('posts:post_detail', kwargs={'pk': self.pk})

    def number_of_followers(self):
        return self.followers.count()

Вот мой менеджер по модели последователей:

class FollowerManager(models.Manager):
    use_for_related_fields = True

    def follow(self, user, pk):
        post_object = get_object_or_404(Post, pk=pk)
        if user.is_authenticated():
            if user in post_object.followers.all():
                Follower.objects.filter(post=post_object, user=user).delete()
            else:
                Follower.objects.create(post=post_object, user=user)

Вот модель последователя:

class Follower(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    post = models.ForeignKey(Post, on_delete=models.CASCADE)
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)

    objects = FollowerManager()

1 Ответ

0 голосов
/ 10 января 2019

Взаимодействие между браузером пользователя и базой данных может осуществляться только через URL-адрес и представление. Это представление может вызывать метод модели, но браузер не может напрямую вызвать этот метод.

(Также я не понимаю, что вы делаете в менеджере. Почему вы удаляете подписчиков, если пользователь прошел проверку подлинности? Обратите внимание, что это всегда будет так, поэтому подписчики будут всегда удаляться.)

...