Django 模型字段自动递增,但不根据 ID

Django model field automatically incremented, but not according IDs

我是 Django 的初学者,我一直在搜索这个问题,但没有找到令人满意的解决方案。

假设我想创建一个模型来识别给定的 table 中给定的 chair 房子房间,以及它的高度(椅子)。然后考虑如下记录:

House Room Table Chair Chair Height (cm)
White House Kitchen 1 1 75
White House Kitchen 2 1 55
White House Kitchen 2 2 65
Buckingham Palace Main State Room 1 1 70
Buckingham Palace Main State Room 1 2 70

复合主键应包括 House、Room、Table 和 Chair。一旦引入 House、Room 和 Table,我创建的模型不允许我增加 Chair 的整数值。有没有办法在 models.py 文件中做到 ?我不想让用户在chair字段中引入任何数字,而是根据已经引入的house、room和table来引入对应的下面一个(有例如,不应该是没有第一把和第二把椅子的第三把椅子。

我一直在搜索 AutoField 类型,但它似乎不是我想要的。在开发的其他部分是否需要考虑这一点? (用户表单...)

非常感谢您。

class ChairLocation(models.Model):
    house = models.CharField()
    room = models.CharField()
    table = IntegerField(validators=[MinValueValidator(1)])
    chair = IntegerField(validators=[MinValueValidator(1)])   #¿?¿?¿?¿?

    class Meta:
        unique_together = (('house', 'room', 'table', 'chair),)

...

你需要重写你模型的save方法,然后获取chair的最高值,自己递增。

from django.db.models import Max

class ChairLocation(models.Model):
    house = models.CharField()
    room = models.CharField()
    table = IntegerField(validators=[MinValueValidator(1)])
    chair = IntegerField(validators=[MinValueValidator(1)])   #¿?¿?¿?¿?

    class Meta:
        unique_together = (('house', 'room', 'table', 'chair'),)

    def save(self, *args, **kwargs):
        max_chair = 0
        try:
            max_chair = ChairLocation.objects.filter(house=self.house, room=self.room, table=self.table).aggregate(Max('chair'))["chair__max"]
        except:
            max_chair = 0
        self.chair = max_chair + 1
        return super(ChairLocation, self).save(*args, **kwargs)