Ранее попытался задать более конкретную версию этого вопроса, но не смог сформулировать, в чем заключался мой вопрос. Подумав, это заставило меня усомниться в том, что выбранное мной решение было правильным для проблемы, поэтому на этот раз я объясню проблему и спрошу, а) я на правильном ли пути и б) есть ли способ обойти мою нынешнюю кирпичную стену.
В настоящее время я создаю веб-интерфейс, чтобы существующая база данных могла быть опрошена (небольшим количеством) пользователей. Придерживаясь аналогии из документации, у меня есть модели, которые выглядят примерно так:
class Musician(models.Model):
first_name = models.CharField(max_length=50)
last_name = models.CharField(max_length=50)
dob = models.DateField()
class Album(models.Model):
artist = models.ForeignKey(Musician)
name = models.CharField(max_length=100)
class Instrument(models.Model):
artist = models.ForeignKey(Musician)
name = models.CharField(max_length=100)
Где у меня есть одна центральная таблица (музыкант) и несколько таблиц связанных данных, которые связаны либо с помощью ForeignKey, либо с помощью OneToOneFields. Пользователи взаимодействуют с базой данных, создавая критерии фильтрации для выбора подмножества музыкантов на основе данных, данных в основных или связанных таблицах. Аналогичным образом, пользователи могут затем выбрать, какая часть данных используется для ранжирования результатов, которые им представляются. Затем результаты сначала просматриваются в виде двумерной таблицы с одной строкой для каждого музыканта с выбранными полями данных (или агрегатами) в каждом столбце.
Чтобы дать вам некоторое представление о масштабе, в базе данных около 5000 музыкантов с примерно 20 полями связанных данных.
До сих пор все в порядке, и у меня есть рабочая реализация. Однако важно, чтобы у меня была возможность для данного пользователя загружать свои собственные наборы данных аннотаций (более одного), а затем фильтровать и упорядочивать их так же, как они могут с существующими данными.
То, как я пытался это сделать, заключалось в добавлении моделей:
class UserDataSets(models.Model):
user = models.ForeignKey(User)
name = models.CharField(max_length=100)
description = models.CharField(max_length=64)
results = models.ManyToManyField(Musician, through='UserData')
class UserData(models.Model):
artist = models.ForeignKey(Musician)
dataset = models.ForeignKey(UserDataSets)
score = models.IntegerField()
class Meta:
unique_together = (("artist", "dataset"),)
У меня есть простой механизм загрузки, позволяющий пользователям загружать файл набора данных, который состоит из отношения 1 к 1 между музыкантом и его «оценкой». В заданном пользовательском наборе данных каждый исполнитель будет уникальным, но разные наборы данных не зависят друг от друга и часто содержат записи об одном и том же музыканте.
Это отлично сработало для отображения данных, начиная с данного исполнителя, я могу сделать что-то вроде этого:
artist = Musician.objects.get(pk=1)
dataset = UserDataSets.objects.get(pk=5)
print artist.userdata_set.get(dataset=dataset.pk)
Однако этот подход потерпел неудачу, когда я пришел к реализации фильтрации и упорядочения набора запросов музыкантов на основе данных, содержащихся в одном наборе данных пользователя. Например, я мог бы легко упорядочить набор запросов на основе всех данных в таблице UserData следующим образом:
artists = Musician.objects.all().order_by(userdata__score)
Но это не помогает мне упорядочивать по результатам данного одного пользовательского набора данных. Точно так же мне нужно иметь возможность фильтровать набор запросов на основе «оценок» из разных наборов пользовательских данных (например, найти всех музыкантов с оценкой> 5 в наборе данных1 и ‹ 2 в наборе данных2).
Есть ли способ сделать это, или я все делаю неправильно?