Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django模型:两个用户之间的对话_Python_Django_Database_Postgresql_Django Models - Fatal编程技术网

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,
    )