Position
モデルに関連する ForeignKey フィールドを持つモデルがありますEmplacement
。の管理者でEmplacement
、のインライン管理者を設定しました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 <num_position> 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()