为什么不能在 Django 模型中对同一模型使用 2 个单独的外键

Why cannot use 2 separate foreign keys for same model in django model

我有一个不起作用的理论模型:

class Message(models.Model):
       text = models.TextField()
       created = models.DateTimeField(auto_now_add=True)
       sender = models.ForeignKey(User)
       receiver = models.ForeignKey(User)

现在,如果用户向某人发送消息,例如私人消息线程,您有发送消息的人和接收消息的人,了解这一点很重要。我认为这两者都应该是一对多的,因为每个用户都可以发送无限条消息。发送者和接收者都是用户,来自同一个模型User,但他们必须是不同的人。我让 django 抱怨

django.core.management.base.CommandError: System check identified some issues:

ERRORS:
chat.Message.receiver: (fields.E304) Reverse accessor for 'Message.receiver' clashes with reverse accessor for 'Message.sender'.
    HINT: Add or change a related_name argument to the definition for 'Message.receiver' or 'Message.sender'.
chat.Message.sender: (fields.E304) Reverse accessor for 'Message.sender' clashes with reverse accessor for 'Message.receiver'.
    HINT: Add or change a related_name argument to the definition for 'Message.sender' or 'Message.receiver'.

我应该添加 unique=True 因为你不能给自己发消息吗?这是在用户之间实现消息的糟糕方式吗?我的错误是什么?谢谢,

科迪

如错误消息所述,将 related_name 参数添加到外键定义中:

class Message(models.Model):
    text        = models.TextField()
    created     = models.DateTimeField(auto_now_add=True)
    sender      = models.ForeignKey(User, related_name='messages_sent')
    receiver    = models.ForeignKey(User, related_name='messages_received')

这些相关的名称可以在 backward relations 中使用,如下所示:

user = User.objects.get(username='johndoe')
messages_from = user.messages_sent.all()
messages_to = user.messages_received.all()

相当于:

user = User.objects.get(username='johndoe')
messages_from = Messages.objects.filter(sender=user)
messages_to = Messages.objects.filter(receiver=user)