Модели без 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