如何将唯一的一起约束作为字段 django 回调

how to call back unique together constraints as a field django

我正在尝试回调唯一约束字段,在我的项目中我必须计算所选 M2M 的数量

class Booking(models.Model):
    room_no = models.ForeignKey(Room,on_delete=models.CASCADE,blank=True,related_name='rooms')
    takes_by = models.ManyToManyField(Vistor)

    @property
    def no_persons(self):
        qnt =  Booking.objects.filter(takes_by__full_information=self).count()#but this doesnt  work
        return qnt

Cannot query "some room information": Must be "Vistor" instance.

class Vistor(models.Model):
    full_name = models.CharField(max_length=150)
    dob = models.DateField(max_length=14)
    city = models.ForeignKey(City,on_delete=models.CASCADE)

    class Meta:
        constraints = [
            models.UniqueConstraint(fields=['full_name','dob','city'],name='full_information')
        ]

    def __str__(self):
        return f'{self.full_name} - {self.city} - {self.dob}'

是否可以通过 Booking 模型访问 full_information?谢谢..

如果您想计算与该预订相关的 Visitor 的数量,您可以使用以下方法计算:

@property
def no_persons(self):
    self.<strong>taken_by.count()</strong>

这将对数据库进行额外的查询,因此通常最好让数据库在查询中计算这些。因此,您可以删除 属性,并查询:

from django.db.models import Count

Booking.objects.annotate(
    <strong>no_persons=Count('takes_by')</strong>
)

由此 QuerySet 产生的 Booking 将有一个额外的属性 no_persons 以及相关 Visitor 的数量。