Как выполнить фильтрацию по типу экземпляра при использовании пакета Django-Polymorphic? - PullRequest
0 голосов
/ 31 января 2019

Я немного застрял при необходимости создания запроса Django для фильтрации по типу экземпляра при использовании django-polymorphic.

from polymorphic.models import PolymorphicModel

class ClassA(models.Model):
    project = select2.fields.ForeignKey(Project, related_name="class_a")
    some_value = models.FloatField(default=0.0)

class Project(PolymorphicModel):
    topic = models.CharField(max_length=30)

class ArtProject(Project):
    artist = models.CharField(max_length=30)

class ResearchProject(Project):
    supervisor = models.CharField(max_length=30)

Как мне отфильтровать объекты ClassA, где находится его проектa "ArtProject"?

ClassA.objects.filter (...?) .update (some_value = 0.0)

Я пытался разбить его, набрав:

art_set = ArtProject.objects.all().values_list("project__id", flat=True)
ClassA.objects.filter(id__in=art_set).update(some_value=0.0)

Ошибка: «Вы не можете указать целевую таблицу« ClassA »для обновления в предложении FROM»

Возможно, я могу использовать, но я пытаюсь отфильтровать связанный класс ... Iя не уверен, что это в правильном направлении ... https://django -polymorphic.readthedocs.io / en / stable / advanced.html # using-extended-q-objects-in-any-place

Заранее спасибо!

Обновление: Я могу выполнить следующее:

art_set = ArtProject.objects.all()
ClassA.objects.filter(project__in=art_set).update(some_value=0.0)

Однако переведенный оператор SQL будет очень длиннымесли ArtProjects было много записей.Я не уверен, стоит ли мне избегать оператора «in», когда ArtProjects имеет тысячи записей.

Я просматривал операторы Q, но не уверен, как его использовать в этом случае.https://django -polymorphic.readthedocs.io / en / stable / advanced.html # using-extended-q-objects-in-any-place

Q2 = Projects.translate(Q(project__instance_of=ArtProject))
ClassA.objects.filter(Q2).update(some_value=0.0)

Однако я получаювозникла исключительная ситуация: ('Связанное поле получило недопустимый поиск: instance_of',)

1 Ответ

0 голосов
/ 31 января 2019

Похоже, есть два способа сделать это:

1-й метод:

art_set = ArtProject.objects.all()
ClassA.objects.filter(project__in=art_set).update(some_value=0.0)

2-й метод:

ClassA.objects.filter(project__artproject__isnull=False).update(some_value=0.0)

Надеюсь, это поможет любому, кто столкнется с подобной проблемой!Cheers,

...