Как создать уникальный объект для модели Django с полем "многие ко многим"?

Я хочу создать уникальный объект (не может существовать другой экземпляр с такими же полями). Этот объект имеет отношение многие ко многим, что делает его уникальным.

Объект представляет собой поток сообщений, и этот поток представляет собой диалог между двумя пользователями (на самом деле это может быть разговор между несколькими пользователями, поскольку я использую поле "многие ко многим", но меня интересуют только два пользователя).

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 ответ

Решение

Вы не можете использовать get_or_create прямо за м2. Вы можете сделать что-то вроде этого:

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
Другие вопросы по тегам