我有一个带有外键的标准模型,在这种情况下是生物学的:种子到分类群。分类单元模型既包括动物分类单元,也包括植物分类单元,并且具有动物学或植物学的类别列
当我添加一个新的种子时,我得到了预期的下拉列表,但是它提供了生态学和植物学的选择。如何过滤它,以便仅显示植物学选项?我假设可以将此过滤器应用于模型中的某处?我尝试添加.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"
答案 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'
)
看起来不错。
希望这会有所帮助。