Я новичок в Django, и я искал это, но не нашел удовлетворительного решения.
Допустим, я хотел бы создать модель для определения данного стула стола, расположенного в данной комнате дома, а также его высоты (стул). Затем рассмотрим записи, подобные следующим:
Составной первичный ключ должен включать Дом, Комнату, Стол и Стул. Созданная мной модель не позволяет мне увеличивать целочисленное значение стула после того, как введены дом, комната и стол. Есть ли способ сделать это в файле models.py? Я не хочу позволять пользователю вводить любое число для поля стула, а вводить соответствующий следующий номер в соответствии с уже введенным домом, комнатой и столом (не должно быть, например, 3-го стула без существующего 1-го и 2-й).
Я искал тип 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),)
...
Спасибо за вашу помощь @BriseBalloches, но я еще не нашел решения.
Вам нужно переопределить метод сохранения вашей модели, затем получить максимальное значение стула и увеличить его самостоятельно.
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)
Кажется, он что-то делает, но я не знаю, что именно. Он всегда включает значение «2» для поля, как если бы оно всегда попадало в исключение:
ЖДАТЬ! Это была моя вина, так как я не импортировал Макса! Это работает сейчас!
Как можно «сказать спасибо» здесь, в stackoverflow? это не кнопка "спасибо"?
Проверка ответа и голосование - это путь! Без проблем ! :)
Моя репутация ниже 15... Я могу подтвердить, но не проголосовать :( Большое спасибо!
Взгляните на этот вопрос: stackoverflow.com/questions/33922447/…