Nano Hash - криптовалюты, майнинг, программирование

Является ли отношение «многие ко многим» с дополнительными полями подходящим инструментом для моей работы?

Ранее попытался задать более конкретную версию этого вопроса, но не смог сформулировать, в чем заключался мой вопрос. Подумав, это заставило меня усомниться в том, что выбранное мной решение было правильным для проблемы, поэтому на этот раз я объясню проблему и спрошу, а) я на правильном ли пути и б) есть ли способ обойти мою нынешнюю кирпичную стену.

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

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).

Есть ли способ сделать это, или я все делаю неправильно?

18.08.2009

Ответы:


1

редактировать: неважно, это неправильно. Я оставлю это, чтобы вы могли прочитать, но потом я удалю.

Hi,

Если я правильно понял, то можно попробовать так:

artists = Musician.objects.select_related('UserDataSets').filter( Q(userdata__score_gt=5, userdata__id=1) | Q(userdata__sorce_lt=2, userdata__id=2 ) 

Для получения дополнительной информации о том, как использовать Q, проверьте это: Сложный поиск с объектами Q.

18.08.2009
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..