Отфильтрованный по Django набор запросов в поиске посторонних ключей - PullRequest
0 голосов
/ 19 июня 2019

У меня есть стандартная модель с иностранным ключом, в данном случае из биологии: Seed to Taxon.Модель таксона включает в себя как таксоны животных, так и растения, и имеет столбец категории, который называется либо зоологией, либо ботаникой

. Когда я добавляю новое семя, я получаю ожидаемый раскрывающийся список, но он содержит параметры зоологии и ботаники.Как мне отфильтровать его, чтобы отображались только параметры ботаники?Я предполагаю, что этот фильтр может быть применен где-то в модели?Я пытался добавить .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 голосов
/ 19 июня 2019

Если поле 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, вы можете изменить поле taxon_id так, чтобы оно включало limit_choices_to:

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'
)

Я явно не проверял этот случай, но что-то подобное должно работать. Если вы хотите фильтровать в других местах, то filter, упомянутый Хуаном в комментарии, выглядит хорошо.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...