Django Queryset не работает после преобразования в дочерний класс класса Abstract
Более года я строю многие свои запросы, используя Django Model, где у меня есть простые отношения между не абстрактными объектами модели, и все работало отлично :
class Taxon(models.Model):
parent = models.ForeignKey("self", on_delete=models.CASCADE, null=True, blank=True, related_name='children')
rank = models.CharField(max_length=200, unique=False, default="NA")
name = models.CharField(max_length=200, unique=False, default="NA")
class Sequence(models.Model):
taxon = models.ForeignKey(Taxon, null=True, blank=True, on_delete=models.CASCADE)
amplicon = models.CharField(max_length=1000, unique=False)
sequence = models.CharField(max_length=1000, unique=False)
score = models.FloatField()
Пример набора запросов с использованием моей модели :
taxon.sequence_set.filter(stuff_filtering)
Но недавно мне пришлось применить некоторые изменения в моей базе данных, и мои объекты Sequence теперь производны от абстрактного класса Observation, становясь такими
class Observation(models.Model):
taxon = models.ForeignKey(Taxon, null=True, blank=True, on_delete=models.CASCADE)
class Meta:
abstract = True
class Sequence(Observation):
amplicon = models.CharField(max_length=1000, unique=False)
sequence = models.CharField(max_length=1000, unique=False)
score = models.FloatField()
def __str__(self):
return str((self.amplicon, self.sequence, self.score, self.taxon))
Я ничего не менял в своем наборе запросов, потому что в документации django об абстрактном классе (https://docs.djangoproject.com/en/3.2/topics/db/models/) говорится, что вы все еще можете использовать ваш chlid_set в запросе. Однако я столкнулся с этой ошибкой и не могу понять почему.
AttributeError: 'QuerySet' object has no attribute 'sequence_set'
Зная, что в случае абстрактных базовых классов, в db должна быть создана таблица для каждого дочернего объекта с родительским атрибутом... Итак, у меня есть объект Sequence со связанным объектом Taxon
По-видимому, решением этой проблемы является получение объекта Taxon с помощью get, а не фильтра (событие, если возвращается только один объект).
taxon = Taxon.objects.filter(...)
возврат только одного значения стал
taxon = Taxon.objects.get(...)
Для меня это кажется довольно загадочным, так как я до сих пор не понимаю, почему он прекрасно работал с моей предыдущей моделью