【问题标题】:How can I filter manytomany models?如何过滤多对多模型?
【发布时间】:2020-01-11 07:53:42
【问题描述】:

我想在 ex.pear 上过滤我的地块对象。输入通过多线程链接到绘图。这是结构:

这是我从中得到的数据:

我想要的:

结果:

我尝试了以下方法:

plots = Plot.objects.filter(fruittype__fruit="Pear")
inputs = Input.objects.filter(plot__in=plots).distinct()

这已经为我的问题提供了一个接近的解决方案,但不是我想要的。

现在我只想过滤掉仍然与苹果一起出现的其他图。

模型输入:

class Product (models.Model):
    type = models.ForeignKey(Type, on_delete=models.CASCADE)
    product = models.CharField(max_length=70)
    standaard_dosis = models.FloatField()

    def __str__(self):
        return self.product
class Input (models.Model):
    datum = models.DateField()
    plot = models.ManyToManyField(Plot)

    def __str__(self):
        return str(self.datum)

class ProductInputs (models.Model):
    input = models.ForeignKey(Inputs, on_delete=models.CASCADE, default="")
    product = models.ForeignKey(Product, on_delete=models.CASCADE, default="")
    dosis = models.FloatField()

    def __str__(self):
        string = str(self.product)
        return string

模型图:

class Fruit(models.Model):
    fruit = models.CharField(max_length=30, primary_key=True)

    def __str__(self):
        return self.fruit

    class Meta:
        verbose_name_plural = "fruits"


class Fruittype(models.Model):
    fruit = models.ForeignKey(Fruit, on_delete=models.CASCADE)
    fruittype = models.CharField(max_length=30, primary_key=True)

    def __str__(self):
        return self.fruittype

    class Meta:
        verbose_name_plural = "fruitypes"


class Plot(models.Model):
    name = models.CharField(max_length=30)
    fruittype = models.ForeignKey(Fruittype, on_delete=models.CASCADE)

    def __str__(self):
        return str(self.fruittype.fruit) + " | " + self.name

    class Meta:
        verbose_name_plural = "plots"

【问题讨论】:

  • 你应该展示你的模型。

标签: django database django-models django-views many-to-many


【解决方案1】:

您的Plot 查询集没有达到应有的深度。我认为你应该改成这样的(虽然这有点矫枉过正)

plot_ids = Plot.objects.filter(fruittype__fruit__fruit="Pear").values_list('pk', flat=True)

plot_ids = Plot.objects.filter(fruittype__fruittype="Pear").values_list('pk', flat=True) # I don't know what fruittype is but I guess this would help you

然后是你的“输入”

inputs = Input.objects.filter(plot__pk__in=plot_ids).distinct()

你可能也想试试这个:

from django.db.models import Prefetch
Input.objects.prefetch_related(
    Prefetch('plot', queryset=Plot.objects.filter(fruittype__fruit__fruit="Pear"))
)

【讨论】:

  • 我已经更新了我的答案,虽然我不知道它是否会起作用
  • 非常感谢,两者的结合帮助了我。我做了all_inputs=Input.objects.filter(plot__pk__in=plot_ids).distinct().prefetch_related(Prefetch('plot', queryset=Plot.objects.filter(fruittype__fruit__fruit="Pear")))
【解决方案2】:

它适用于:

all_inputs=Input.objects.filter(plot__pk__in=plot_ids).distinct().prefetch_related(Prefetch('plot', queryset=Plot.objects.filter(fruittype__fruit__fruit="Pear")))

【讨论】:

    猜你喜欢
    • 2016-10-11
    • 1970-01-01
    • 2015-10-21
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-21
    相关资源
    最近更新 更多