Джанго - Как ссылаться на определенный тип в общем внешнем ключе?
Я сделал общий внешний ключ, чтобы иметь возможность ссылаться на любой тип (A или B) модели в модели отчета.
Это работает нормально, но моя проблема в том, что теперь мне нужно сделать запрос для получения всех экземпляров Report, ссылающихся на определенный тип Model (например, весь Report с иностранным ключом, ссылающимся на класс A). Я пытался получить доступ к content_type в базе данных, но, по-видимому, это невозможно (переменная не существует...)
Вот мои модели:
class Report(models.Model):
content_type = models.ForeignKey(ContentType)
object_id = models.CharField(max_length=50)
reported_item = generic.GenericForeignKey('content_type', 'object_id')
class A(models.Model):
reports = generic.GenericRelation(Report)
class B(models.Model):
reports = generic.GenericRelation(Report)
У вас есть идеи, как это сделать?
На случай, если это что-то изменит, я использую mongoDB для своей базы данных.
Спасибо большое!
РЕДАКТИРОВАТЬ:
Когда я отображаю объект отчета в БД, вот результат:
db.website_report.findOne()
{
"_id" : ObjectId("50afa903a96c5c2f63000001"),
"content_type_id" : ObjectId("50afa903a96c5c2f63000000"),
"object_id" : "50afa8a8a96c5c2f53000001",
}
Как вы можете видеть, содержимое базы данных не имеет ничего общего с моими моделями, поэтому я не знаю, как выполнить запрос, чтобы получить весь отчет, имеющий Foreign_key of A.
Вы можете мне помочь?
3 ответа
Я не понимаю, почему вы думаете, БД не отражает вашу модель. Там у вас есть ссылка на тип контента и идентификатор объекта. Все, что вам нужно для vdo, это выяснить, какой тип контента относится к вашей модели A, что объясняется в документации по типу контента:
ct = ContentType.objects.get_for_model(A)
objs = Report.objects.filter(content_type=ct)
Это пример класса из одного из моих проектов, он показывает ограничение определенными моделями и приложением, использующим объекты Q
class ContainerItem(models.Model) :
"""Items for containers"""
limit = models.Q(model="page") & (models.Q(app_label='events') | models.Q(app_label='press')) & ~models.Q(app_label='press', model='category')
object_type = models.ForeignKey(ContentType, limit_choices_to=limit)
object_id = models.IntegerField(db_index=True)
object = generic.GenericForeignKey(
ct_field = "object_type",
fk_field = "object_id"
)
Фильтрация по GenericForeignKeys невозможна:
Из-за способа реализации GenericForeignKey такие поля нельзя использовать напрямую с фильтрами (например, filter() и exclude()) через API базы данных. Поскольку GenericForeignKey не является обычным полевым объектом, эти примеры не будут работать: