Django Models making unique ,unique_together

Я новичок и создаю чат в реальном времени с Django Web Sockets для своего портфолио, поэтому у меня есть модель Thread, которая содержит first_person и second_person, так что это похоже на комнату один на один .

from django.db import models
from django.contrib.auth.models import User
# Create your models here.
from django.db.models import Q


class ThreadManager(models.Manager):
    def by_user(self, **kwargs):
        user = kwargs.get('user')
        lookup = Q(first_person=user) | Q(second_person=user)
        qs = self.get_queryset().filter(lookup).distinct()
        return qs



class Thread(models.Model):
    first_person = models.ForeignKey(User,on_delete = models.CASCADE,related_name='first_person')
    second_person = models.ForeignKey(User,on_delete = models.CASCADE,related_name='second_person')
    objects  = ThreadManager()
    updated = models.DateTimeField(auto_now=True)
    timestamp = models.DateTimeField(auto_now_add=True)

    class Meta:
        unique_together = ('first_person', 'second_person')

Моя проблема в том, что я хочу сделать эту модель Thread уникальной. Я использовал unique_together, как вы можете видеть в модели Thread, но он работает только для одного способа. Например, если я ввожу first_person : Alex и second_person : Sam, он сохраняет. Но и наоборот, если я поменяю местами людей, например: первый_человек :Сэм и второй_человек : Алекс, то сохраняет.

Я также попробовал этот код в моем admin.py:

 
class ThreadForm(forms.ModelForm):
    def clean(self):

            super(ThreadForm, self).clean()
            first_person = self.cleaned_data.get('first_person')
            second_person = self.cleaned_data.get('second_person')
            lookup1 = Q(first_person=first_person) & Q(second_person=second_person)
            lookup2 = Q(first_person=second_person) & Q(second_person=first_person)
            lookup = Q(lookup1 | lookup2)
            qs = Thread.objects.filter(lookup)
            if qs.exists():
                raise ValidationError(f'Thread between {first_person} and {second_person} already exists.')


но это не сработало. Я прочитал, что нужно изменить функцию create в менеджере потоков, но не понял как?

Есть ли какие-нибудь решения для этого.

Что если вы попробуете что-то вроде следующего?

class Thread(models.Model):
    # More code here

    class Meta:
        unique_together = (
            ('first_person', 'second_person'),
            ('second_person', 'first_person'),
        )

Также у вас есть следующая возможность:

class Thread(models.Model):
    # More code here

    class Meta
        constraints = [
            UniqueConstraint(
                Lower('first_person'),
                Lower('second_person'),
                name='first_second_name_unique',
            ),
            UniqueConstraint(
                Lower('second_person'),
                Lower('first_person'),
                name='second_first_name_unique',
            ),
        ]

Надеюсь, вы решите проблему.

Вернуться на верх