Python Django模型:两个用户之间的对话
我正在尝试创建一个Python Django模型:两个用户之间的对话,python,django,database,postgresql,django-models,Python,Django,Database,Postgresql,Django Models,我正在尝试创建一个模型,它表示两个用户(只有两个)之间的对话 无法确定如何创建两个字段,因为用户是等效的 class Conversation(models.Model): user_one = ForeignKey('auth.User') user_two = ForeignKey('auth.User') class Meta: unique_together = ('user_one','user_two') 这是我设计模型的最好方法吗 然后
模型
,它表示两个用户(只有两个)之间的对话
无法确定如何创建两个字段,因为用户是等效的
class Conversation(models.Model):
user_one = ForeignKey('auth.User')
user_two = ForeignKey('auth.User')
class Meta:
unique_together = ('user_one','user_two')
这是我设计模型的最好方法吗
然后是管理者方法:
def get_conversation(user_one,user_two):
c = Conversation.objects.filter(Q(user_one=user_one,user_two=user_two)|Q(user_one=user_one,user_two=user_two))
return c
还是有一种更舒适的方式来处理这种模式?例如,使用ManyToManyField
检查是否有两个且只有两个用户:
users = ManyToManyField('auth.User')
当同一型号有多个外键时,请使用
相关的\u name
字段。因为您通常不关心用户1和用户2是谁,所以您可以简单地确保用户1和用户2是一致的。在本例中,我使用user's id字段来表示哪个用户将是user\u one,哪个将是user\u two。这使得查询更简单,因为您不需要对两对(a,B)和(B,a)进行查询
如果您使用postgres,您可以使用: 这将有助于查找。但是,请注意文档当前对
size
参数的说明:
这是一个可选参数。如果通过,数组将具有指定的最大大小。这将被传递到数据库,尽管PostgreSQL目前没有强制执行该限制
我不是问你相关的名字。我只是不认为这是最好的方法,因为用户是完全平等的。对于两个不同的用户,查找可能会有点混乱。@MilanoSlesarik Gotcha,因此如果您认识两个用户,并且想要查询他们在一起进行过哪些对话,则必须执行user_one=A、user_two=B,反之亦然。可能有一个我不知道的好方法,但是如果你规范化了哪个用户是哪个用户呢?例如,user_one始终是id最小的用户。您可以编写一个简单的助手来检索给定2个用户的对话,并将一些逻辑放入
clean
方法中,如果用户id的顺序不正确,该方法将交换用户。编辑答案以包含示例
class Conversation(models.Model):
user_one = ForeignKey('auth.User', related_name="user_one")
user_two = ForeignKey('auth.User', related_name="user_two")
class Meta:
unique_together = ('user_one','user_two')
def clean(self):
# Ensure that user_one's id is always less than user_two's
if self.user_one and self.user_two and self.user_one.id > self.user_two.id:
(self.user_one, self.user_two) = (self.user_two, self.user_one)
@classmethod
def get(cls, userA, userB):
""" Gets all conversations between userA and userB
"""
if userA.id > userB.id:
(userA, userB) = (userB, userA)
return cls.objects.filter(user_one=userA, user_two=userB)
class Conversation(models.Model):
users = ArrayField(
ForeignKey('auth.User'),
size=2,
)