我想创建一个唯一的对象(它不能存在具有相同字段的另一个实例)。该对象具有多对多的关系,这使得它具有独特性。
该对象是一个消息的线程,这个线程是两个用户之间的对话(实际上它可能在更多用户之间,因为我使用的是多对多的字段,但我只对两个用户感兴趣)。
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'
有什么建议吗?
感谢。
答案 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