Django在外键查找中过滤的查询集

时间:2019-06-19 19:18:01

标签: django

我有一个带有外键的标准模型,在这种情况下是生物学的:种子到分类群。分类单元模型既包括动物分类单元,也包括植物分类单元,并且具有动物学或植物学的类别列

当我添加一个新的种子时,我得到了预期的下拉列表,但是它提供了生态学和植物学的选择。如何过滤它,以便仅显示植物学选项?我假设可以将此过滤器应用于模型中的某处?我尝试添加.filter()和.exclude(),但是它们在这里什么也不做。

class Taxon(models.Model):
    taxon_id = models.AutoField(primary_key=True)
    taxon = models.CharField(max_length=50, blank=True, null=True)
    common_name = models.CharField(max_length=50, blank=True, null=True)
    taxon = models.CharField(max_length=50, blank=False, null=False)
    genus = models.CharField(max_length=50, blank=True, null=True)
    category = models.CharField(max_length=50, blank=True, null=True)
    # family_name = models.CharField(max_length=50, blank=True, null=True)

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

    class Meta():
        managed=False
        db_table = 'kap\".\"taxon_manager'
        ordering = ["genus","taxon"]
        verbose_name_plural = "taxon"

class Seed(models.Model):
    seed_id = models.AutoField(primary_key=True)
    fraction_id = models.ForeignKey(Fraction, db_column='fraction_id', blank=True, null=True, on_delete = models.PROTECT)
    taxon_id = models.ForeignKey(Taxon, db_column='taxon_id', blank=True, null=True, on_delete = models.PROTECT, related_name='seed_taxon')
    weight_type = models.CharField(max_length=50)
    weight = models.DecimalField(max_digits=10, decimal_places=3)
    quantity_type = models.CharField(max_length=50)
    quantity = models.IntegerField()

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

    class Meta():
        managed=False
        db_table = 'kap\".\"seed'
        ordering = ["taxon_id","fraction_id"]
        verbose_name_plural = "seeds"

1 个答案:

答案 0 :(得分:0)

如果您的inspect>console模型中的category字段是“动物学”和“植物学”之间的选择,那么我会像这样选择它们:

Taxon

然后,如果要在class Taxon(models.Model): ZOOLOGY = 0 BOTANY = 1 CATEGORY_CHOICES = ( (ZOOLOGY, 'Zoology'), (BOTANY, 'Botany'), ) <your other fields> category = models.CharField(max_length=50, choices=CATEGORY_CHOICES, blank=True, null=True) 模型中进行过滤,则可以更改seed字段,使其包含limit_choices_to

taxon_id

我没有明确测试这种情况,但是类似上面的方法应该可以工作。如果要在其他位置进行过滤,那么Juan在评论中提到的taxon_id = models.ForeignKey( Taxon, db_column='taxon_id', limit_choices_to={'category': Taxon.BOTANY}, blank=True, null=True, on_delete = models.PROTECT, related_name='seed_taxon' ) 看起来不错。

希望这会有所帮助。