【发布时间】:2013-02-07 10:04:21
【问题描述】:
我有一个 Position 模型,其 ForeignKey 字段与 Emplacement 模型相关。
在Emplacement 的管理员中,我为Position 设置了一个内联管理员。
我想要实现的是,当Emplacement实例中修改num_position字段时,删除与该实例相关的位置并创建新的位置。
为了实现这一点,我重写了 Emplacement 模型的 save() 方法并检查 num_position 是否已更改。
问题是在修改其num_position 字段后保存Emplacement 模型时,我收到以下错误:
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()
【问题讨论】:
-
我刚刚尝试创建一个新的 django 项目并将此代码粘贴到应用程序中。创建/保存 Emplacement/Position 对象时,我没有看到任何错误。仅运行此代码时您是否看到异常,或者是否有一些特定的方法来触发错误?