在 Django(管理员)中按其他 属性 过滤 属性 个对象

Filter property objects by other property in Django (Admin)

如何在对象(可能在模型中)中用另一个 属性 过滤一个 属性,这样您就不必在访问对象的所有地方都添加过滤。例如:Django Admin、Rest Framework 中的 ViewSet 等。但显然,这可能是不可能的...

我有以下型号:

class Food(models.Model):
    # ...
    pass


class Weight(models.Model):
    # ...
    food = models.ForeignKey('Food')


class Ingredient(models.Model):
    food = models.ForeignKey(Food, null=False)
    amount = models.DecimalField(decimal_places=2, max_digits=5)
    weight = models.ForeignKey(Weight)
    note = models.CharField(max_length=200, null=True, blank=True)

我希望成分下的可能 'Weights' 列表只显示包含我选择的 'Food' 的重量,而不是 Weight.objects.all()

知道怎么去吗?

Ingredient.weight_set.filter(food_name="apple")

假设您想在 Django 管理中更新内容,您可能需要在添加新对象时使用 Ajax,因为在有人做出选择之前,食物是未知的。那时你可以让 jQuery 或类似的东西更新权重小部件中的可用选项。

有一些方法可以在 Django 中过滤编辑可用列表,查看 formfield_for_dbfield(它允许您分配一个 Widget,然后分配查询集),但是您需要先通过 get_form。如果有人进来编辑对象并更改所选食物,这可能会变得复杂并且会使事情变得混乱。然后您将再次需要 ajax 来重写可用选项。

由于您的需求是动态的,我认为 ajax 小部件可能是您的最佳选择。