1

我想创建一个唯一的对象(它不能存在具有相同字段的另一个实例)。这个对象有一个多对多的关系,它负责使它独一无二。

该对象是一个消息线程,该线程是两个用户之间的对话(实际上它可能是在更多用户之间,因为我使用的是多对多字段,但我只对两个用户之间感兴趣)。

class Thread(models.Model):
    users = models.ManyToManyField(User, null=True,blank=True, related_name='threads')

class Mensaje(models.Model):
    thread = models.ForeignKey(Thread, related_name='mensajes')#messages

当一个用户向另一个用户发送消息时,如果该线程不存在,则将创建该线程,如果存在,则该消息将与该线程相关。

我正在尝试这样的事情:

thread = Thread.objects.get_or_create( users= [user1, user2])

但我有下一个例外:

Exception Value: int() argument must be a string or a number, not 'list'

有什么建议么?

谢谢。

4

1 回答 1

1

您不能get_or_create直接用于 m2m。你可以这样做:

user_list = [user1, user2]
thread_qs = Thread.objects.filter(users=user_list[0])
for user in user_list[1:]:
    thread_qs= thread_qs.filter(users=user)
try:
    thread = thread_qs.get() #get if only one object. 
except MultipleObjectsReturned as e:
    print 'Multiple Objects Returned'
except ObjectDoesNotExist: #create object if does not exist
    thread = Thread.objects.create()
    thread.users.add(user_list)
    thread.save() #this might be redundant
于 2013-06-08T19:34:14.203 回答