首页 > 解决方案 > Django不对称关系:返回相交

问题描述

我将 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。这可以用过滤器完成吗?

标签: djangopython-3.xdjango-models

解决方案


为此,您需要放置某种标志来标识关系是否已验证。您可以在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)

推荐阅读