我有一个相当神秘的 MultipleObjectsReturned 错误,在几周没有问题后突然出现。我希望只是我缺少的一些简单的东西。
我有一个Order
模型,一个OrderLine
模型,它有一个Item
外键。每个Item
都有一个外键Product
。以下是简化的模型:
class OrderLine(models.Model):
order = models.ForeignKey(Order, related_name="lines", on_delete=models.CASCADE)
item = models.ForeignKey(Item, on_delete=models.SET_NULL, blank=True, null=True)
class Product(TimeStampedModel):
...
class Item(TimeStampedModel):
product = models.ForeignKey(Product, related_name='items', on_delete=models.CASCADE)
OrderLineForm 和 OrderLineAdmin 供参考:
class OrderLineForm(forms.ModelForm):
class Meta:
model = OrderLine
...
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields['category'].queryset = ItemType.objects.all()
self.fields['product'].queryset = Product.objects.none()
self.fields['item'].queryset = Item.objects.none()
if self.instance.pk:
try: # When changing an existing OrderLine
...
current_item = Item.objects.filter(pk=self.instance.item.pk)
available_items = current_item.union(
get_available_items(...)
)
self.fields['item'].queryset = available_items
self.fields['category'].initial = item_type_id
except:
self.fields['item'].queryset = Item.objects.all()
...
@admin.register(OrderLine)
class OrderLineAdmin(admin.ModelAdmin):
form = OrderLineForm
现在,当我使用 Django admin 编辑ModelChoiceField 查询集中
OrderLine
有多个的查询集时: Item
我在表单清理期间收到以下错误:get() returned more than one Item -- it returned 2!
仔细检查日志后,似乎ModelChoiceField
通过了正确的Item
id/pk,但self.queryset.get(**{key:value})
不知何故从单个 id/pk 返回了 2 个项目,即使这些项目具有不同的 id/pk(49 和 50):
同样,这只发生在OrderLine
表单的Item
字段在查询集中有多个对象时。如果它只是一个单一的Item
,它保存就好了。任何想法为什么我现在收到此错误?谢谢!
在数据库关系方面,我唯一能想到的改变是我添加formset.save_m2m()
到了 Item 模型管理员,但是 Item 不是 m2m 关系,所以也许这可能导致一些数据库索引错误?
PS 我从几年前发现这个https://code.djangoproject.com/ticket/23354似乎在这种情况下引用了错误,但票说它是固定的。