如何为具有多对多字段的Django模型创建唯一对象?

时间:2013-06-08 19:29:44

标签: django object django-models unique django-orm

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

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

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'

有什么建议吗?

感谢。

1 个答案:

答案 0 :(得分: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