[英]Django Models making unique ,unique_together
我是一個初學者,正在為我的投資組合使用 Django Web Sockets 構建實時聊天,所以我有包含 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,但它僅適用於一種方式。例如,如果我輸入 first_person:Alex 和 second_person:Sam,它會保存。 但反之亦然,如果我改變人們的位置,它也會保存,比如:first_person:Sam 和 second_person:Alex。
我還在我的 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.')
但它沒有用。我讀過我需要在線程管理器中更改創建函數,但我不明白怎么做?
有沒有解決方案。
如果您嘗試以下方法怎么辦?
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',
),
]
希望你能解決問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.