【问题标题】:Django related objects in hierarchy层次结构中的 Django 相关对象
【发布时间】:2021-06-12 00:55:59
【问题描述】:

我有一些这样的模型:

class Conversion(models.Model):

    class Unit(models.IntegerChoices):
        g   = 10, 'gramy',
        ml  = 20, 'mililitry',
        qty = 30, 'sztuki'

    name = models.CharField(max_length=128)
    g = models.FloatField()
    ml = models.FloatField(null=True, blank=True)
    qty = models.FloatField(null=True, blank=True)
    default = models.IntegerField(choices=Unit.choices, default=Unit.g)

class Ingredient(models.Model):

    class Unit(models.IntegerChoices):
        g   = 10, 'gramy',
        dkg = 11, 'dekagramy',
        kg  = 12, 'kilogramy',
        ml  = 20, 'mililitry',
        l   = 21, 'litry',
        qty = 30, 'sztuki'

    Conversion = models.ForeignKey(Conversion, on_delete=models.CASCADE, related_name='ingredients')
    amount = models.FloatField()
    unit = models.IntegerField(choices=Unit.choices, default=Unit.g)

class Step(models.Model):
    body = models.JSONField()
    Ingredients = models.ManyToManyField(Ingredient, related_name='steps')

class Recipe(models.Model):
    title = models.CharField(max_length=128)
    teaser = models.CharField(max_length=256)
    Steps = models.ManyToManyField(Step, blank=True, related_name='recipes')

假设有一个面粉的转换,其中 1ml == .53g,并且由于它们的显示方式而将步骤分开,所以我认为最好将它们全部放入单独的模型中。

有没有办法搜索包含成分.Conversion.pk == x 和成分.amount >= y 的步骤的食谱?

我已经阅读了相关对象,但我可以在这种关系中使用它们吗?我应该使用一些内部联接还是有其他方法可以使用 Django 轻松过滤它?

【问题讨论】:

  • 是的,您可以在使用 ORM 过滤时遍历关系。请将您的模型添加到问题中。
  • @AbdulAzizBarkat 给你!

标签: python django


【解决方案1】:

您可以使用__ 遍历查询中的关系。也用于检查一个值是否大于等于使用__gte 的值。你的查询会变成这样:

conversion_pk = # some pk of conversion
ingredient_amount = # ingredient amount
Recipe.objects.filter(Steps__Ingredients__Conversion__pk=conversion_pk, Steps__Ingredients__amount__gte=ingredient_amount)

注意:理想情况下,属性/变量名称应该在snake_case 而不是PascalCase 所以steps 而不是Stepsingredients 而不是Ingredients

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-24
    • 1970-01-01
    • 1970-01-01
    • 2012-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多