Следуя друг за другом django модель - PullRequest
0 голосов
/ 03 февраля 2020

Я хочу построить модель, чтобы следовать друг за другом, я пытался следовать этой ссылке

Но я столкнулся с некоторой ошибкой.

enter image description here

class InstagramBot(models.Model):
    created_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    email = models.CharField(verbose_name='Email', max_length=55)
    ............

и другая модель здесь

class Following(models.Model):
    target = models.ForeignKey(InstagramBot, on_delete=models.CASCADE, related_name='followers_set')
    follower = models.ForeignKey(InstagramBot, on_delete=models.CASCADE, related_name='targets_set')

Здесь я хочу убедиться, что

-> same bot cannot follow itself

-> same bot cannot follow other bots multiple times

-> I want to get list of all the bot with number of followers 

-> I want to get list of all the bot which is not followed by a bot

1 Ответ

1 голос
/ 03 февраля 2020

followers_set может быть получен экземпляром. Поэтому сначала вам нужно получить экземпляр, затем использовать followers_set с этим экземпляром.

obj = InstagramBot.objects.first() # or some other instance by query.
# then you can use the reverse lookup
obj.followers_set.all() # will get all the objects from Following table.

Теперь остальные вопросы:

1. тот же самый бот не может следовать за собой создать новую функцию / метод (stati c функция или метод менеджера) и проверить, являются ли target_id и follower_id одинаковыми условиями.

class Following(models.Model):
    # fields

    def create_follower(user_id, follower_id):
        if user_id == follower_id:
            return

Существует множество способов проверить это состояние, используйте тот, который соответствует вашим целям.

2. один и тот же бот не может следовать за другими ботами несколько раз Вы можете использовать UniqueConstraint , чтобы обеспечить уникальное ограничение для 2 столбцов.

class Following(models.Model):
    # fields
    class Meta:
        constraints = [
        models.UniqueConstraint(fields=['user', 'follower'], name='unique follower')
    ]

или Вы можете вызвать validate_unique () из вашего метода сохранения и выполните свой собственный лог c, чтобы проверить, существует ли уже строка с таким же значением.

3. Я хочу получить список всех ботов с количеством подписчиков Для этого вы можете использовать аннотацию.

from django.db.models import Count

data = InstagramBot.objects.annotate(f_count=Count('followers_set'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...