У меня есть модель Position
с полем ForeignKey, связанным с моделью Emplacement
.
В admin Emplacement
я установил Inline admin для Position
.
Я хочу добиться того, что когда поле num_position
изменено в экземпляре Emplacement
, позиции, связанные с этим экземпляром, удаляются, а новые создаются.
Для этого я переопределяю метод Emplacement
save()
и проверяю, изменился ли num_position
.
Проблема заключается в том, что при сохранении модели Emplacement
после изменения поля num_position
появляется следующее сообщение об ошибке:
ValidationError: Select a valid choice. That choice is not one of the available choices.
Я предполагаю, что это связано с удалением/восстановлением позиций, но я не могу найти почему.
Что не так?
<Б> models.py
class Emplacement(models.Model):
num_position = models.IntegerField()
# more fields
__original_num_position = None
def __init__(self, *args, **kwargs):
super(Emplacement, self).__init__(*args, **kwargs)
self.__original_num_position = self.num_position
def save(self, *args, **kwargs):
if self.num_position != self._Emplacement__original_num_position:
# if num_position has changed, delete existing positions and recreate positions
Position.objects.filter(emplacement=self).delete()
for i in range(self.num_position):
position = Position()
position.emplacement = self
position.number = i+1
position.save()
super(Emplacement, self).save(*args, **kwargs)
class Position(models.Model):
emplacement = models.ForeignKey(Emplacement)
number = models.IntegerField()
<Б> admin.py
class PositionInline(admin.TabularInline):
model = Position
class EmplacementAdmin(admin.ModelAdmin):
inlines = [PositionInline]
my_site.register(Emplacement, EmplacementAdmin)
ИЗМЕНИТЬ
Я также попытался с сигналом, но получил ту же ошибку:
@receiver(post_save, sender=Emplacement)
def create_positions(sender, instance, created, **kwargs):
"""Create positions when num_position has changed."""
if instance.num_position != instance.old_num_position:
Position.objects.filter(emplacement=instance).delete()
for i in range(instance.num_position):
position = Position()
position.emplacement = instance
position.numero = i+1
position.save()