Модели без FK, связанные вместе по ID (неуправляемая модель) - как фильтровать в Django?

У меня есть две связанные модели - но они не являются FK-отношениями в Django, потому что одна из них - неуправляемая модель с данными, поступающими из предварительно заполненной таблицы DB.

class Enrollment(models.Model):
    # This comes from a 'shared app' that is used in other projects 
    id = models.IntegerField(db_column="ID", primary_key=True)
    location_id = models.IntegerField(db_column="locationID")
    grade = models.CharField(db_column="grade", max_length=10)

    class Meta(object):
        managed = False
        db_table = "mytable_Enrollments"

class Location(models.Model):
    # This model exists in an app in the specific project I am working on
    name = models.CharField(max_length=50)
    alternate_name = models.IntegerField()

Я пытаюсь отфильтровать Enrollment модели, используя список Location моделей - но они не связаны между собой отношениями FK.

Я пытаюсь получить данные о зачисленных для определенного места следующим образом:

# This does not work properly because it is returning an empty Queryset when it should have results - but does not hit the db which is what I want
location_ids = Location.objects.filter(id=1).values_list("id", flat=True)
enrollments = Enrollment.objects.filter(location_id__in=location_ids)

Приведенный выше код возвращает пустой набор запросов.

Если я привожу location_ids к списку (например, так: list(location_ids)) и затем фильтрую по нему, это работает.

# This works properly - but hits the db which is NOT what I want
location_ids = Location.objects.filter(id=1).values_list("id", flat=True)
enrollments = Enrollment.objects.filter(location_id__in=list(location_ids))

Есть ли способ использовать Django ORM для получения того, что я хочу в этом случае, не заставляя его оценивать набор запросов?

Дополнительно, я пробовал просто возвращать values вместо values_list, но это также возвращает пустой Queryset, когда он не должен возвращаться.

# This returns empty queryset
location_ids = Location.objects.filter(id=1).values("id")
enrollments = Enrollment.objects.filter(location_id__in=location_ids)

Вы можете выбрать базу данных для QuerySet в любой точке "цепочки" QuerySet. Вызовите using() для QuerySet, чтобы получить другой QuerySet, использующий указанную базу данных.

using() принимает единственный аргумент: псевдоним базы данных, на которой вы хотите выполнить запрос. в вашем примере отредактируйте его следующим образом:

location_ids = Location.objects.using("currentdb").filter(id=1).values("id")
enrollments = Enrollment.objects.using("currentdb").filter(location_id__in=location_ids)

источник: https://docs.djangoproject.com/en/4.0/topics/db/multi-db/#manually-selecting-a-database

Вернуться на верх