Джанго асимметричные отношения: обратное пересечение - PullRequest
0 голосов
/ 26 ноября 2018

Я использую Django 2.1.3 с Python 3.6.6.У меня есть две модели: пользовательская модель User и модель Connection для отслеживания отношений между пользователями, определенные следующим образом:

from django.db import models
from django.contrib.auth.models import 

class User(AbstractUser):
    # (additional fields)
    connections_sent = models.ManyToManyField(
        'self',
        through='Connection',
        # through_fields=('from_user', 'to_user'),
        related_name='connections_received',
        symmetrical=False,
    )

    def __str__(self):
        return self.email

    def add_connection(self, user):
        connection, created = Connection.objects.get_or_create(
            from_user=self,
            to_user=user,
        )
        return connection

    def remove_connection(self, user):
        Connection.objects.filter(
            from_user=self,
            to_user=user,
        ).delete()
        return


class Connection(models.Model):
    from_user = models.ForeignKey(User, related_name='from_users', on_delete=models.CASCADE)
    to_user = models.ForeignKey(User, related_name='to_users', on_delete=models.CASCADE)

    class Meta:
        unique_together = ('from_user', 'to_user')

    def __str__(self):
        return "Connection from {} to {}".format(self.from_user, self.to_user)

Идея состоит в том, что (подобно LinkedIn) пользователи могут отправлять запросы на подключение другим пользователям.(connections_sent), который пользователь-получатель должен подтвердить, прежде чем произойдет дальнейшее взаимодействие.

Я хотел бы определить функцию User.get_confirmed_connections(self), которая фильтрует connections_sent так, чтобы возвращались только подтвержденные соединения.Т.е. он должен вернуть пересечение между connections_sent и connections_received.Можно ли это сделать с помощью фильтров?

1 Ответ

0 голосов
/ 26 ноября 2018

Для этого вам нужно установить какой-нибудь флаг, который определяет, проверено ли отношение или нет.Вы можете добавить это в Connection модель.Попробуйте так:

class Connection(models.Model):
    from_user = models.ForeignKey(User, related_name='from_users', on_delete=models.CASCADE)
    to_user = models.ForeignKey(User, related_name='to_users', on_delete=models.CASCADE)
    is_verified = models.BooleanField(default=False)

и добавьте следующий метод в CustomUser:

def get_confirmed_connection(self):
    return self.from_users.filter(from_users__is_verified=True)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...