Прежде всего, мои извинения за ошибки в английском.
У меня есть три модели: книги (общая модель), BookInfo (информация о книге), местоположение (позиция в библиотеке) с внешним ключом.
models.py
class Location(models.Model):
room = models.PositiveIntegerField()
bookcase = models.PositiveIntegerField()
shelf = models.PositiveIntegerField()
class BookInfo(models.Model):
title = models.CharField(max_length=120)
author = models.CharField(max_length=150)
published = models.CharField(max_length=4)
position = models.ForeignKey(Location, on_delete = models.CASCADE, related_name = 'position_information')
def __str__(self):
return self.title
class Meta:
ordering = ['-id']
unique_together = ['title', 'author']
class Books(models.Model):
ON_HANDS = 1
IN_LIBRARY = 0
ALARM = -1
STATUS = (
(ON_HANDS, 'The book is on hands'),
(IN_LIBRARY, 'The book is in library'),
(ALARM, 'Need to return the book')
)
book = models.ForeignKey('BookInfo', on_delete = models.CASCADE, related_name = 'book_information')
date_of_issue = models.DateField(blank= True, default=timezone.now)
date_of_return = models.DateField(blank= True, default=date.today() + timedelta(days=14))
status_of_book = models.IntegerField(choices = STATUS, default = 0)
def __str__(self):
return self.book.title
class Meta:
ordering = ['-id']
forms.py
class BookFormUpdate(forms.ModelForm):
class Meta:
model = Books
fields = ['book','date_of_issue','date_of_return','status_of_book']
widgets = {
'date_of_issue': forms.DateInput(format=('%Y-%m-%d'), attrs={'class':'form-control', 'placeholder':'Select a date', 'type':'date'}),
'date_of_return': forms.DateInput(format=('%Y-%m-%d'), attrs={'class':'form-control', 'placeholder':'Select a date', 'type':'date'})
}
Когда я использую форму обновления для книг и меняю статус книги на 1 или -1, я хочу автоматически изменить позицию книги на (0,0,0). Я перезаписал свой UpdateView, но у меня возникли проблемы.
views.py
class MainUpdate(UpdateView):
model = Books
template_name = 'core/detail.html'
form = BookFormUpdate
def form_valid(self, form):
form.save()
categories = get_object_or_404(self.model, pk=self.kwargs.get('pk'))
stat = form.cleaned_data['status_of_book']
if stat == 1 or stat == -1:
book_id = categories.book.id
BookInfo.objects.filter(id=book_id).update(position=Location.objects.get(id=32))
return redirect('/books-info/')
Для обновления позиции я использовал Location.objects.get (id = 32) (id = 32 соответствует позиции (0,0,0)).
Есть ли другое решение или лучший способ без перезаписи UpdateView для автоматического изменения позиции?
Я пытался использовать такой код:
# Not work
BookInfo.objects.filter(id=book_id).update(position__room=0,position__bookcase=0,position__shelf=0)
# Not work
BookInfo.objects.select_related().filter(id=book_id).update(position__room=0,position__bookcase=0,position__shelf=0)
# Not work
test = BookInfo.objects.get(id=book_id)
test.position__room=0
test.position__bookcase=0
test.position__shelf=0
test.save(update_fields=['position__room','position__bookcase','position__shelf'])
Спасибо за совет и помощь