2016-11-23 8 views
0

У меня есть следующие модели я хотел бы присоединиться к:Объединение несвязанных моделей и фильтрации QuerySet

Datapoint

class Datapoint(models.Model): 
    id = models.IntegerField(db_column='ID', primary_key=True) # Field name made lowercase. 
    composition = models.ForeignKey(Composition, models.DO_NOTHING, db_column='Composition', blank=True, null=True) # Field name made lowercase. 
    value = models.IntegerField(db_column='Value') # Field name made lowercase. 

Composition

class Composition(models.Model): 
    id = models.IntegerField(db_column='ID', primary_key=True) # Field name made lowercase. 
    name = models.CharField(db_column='Name', max_length=45, blank=True, null=True) # Field name made lowercase. 

DataComponent

class Datacomponent(models.Model): 
    id = models.IntegerField(db_column='ID', primary_key=True) # Field name made lowercase. 
    composition = models.ForeignKey(Composition, models.DO_NOTHING, db_column='Composition_ID', null=True, blank=True) # Field name made lowercase. 
    components = models.ForeignKey(Components, models.DO_NOTHING, db_column='Components_ID') # Field name made lowercase. 
    componentvalue = models.FloatField(db_column='ComponentValue') # Field name made lowercase. 

И, наконец, Component

class Components(models.Model): 
    id = models.IntegerField(db_column='ID', primary_key=True) # Field name made lowercase. 
    name = models.CharField(db_column='Name', max_length=45, blank=True, null=True) # Field name made lowercase. 

Каждый DataPoint содержит внешний ключ к таблице композиции. Datapoint и Composition таблицы связаны между собой. Каждая композиция имеет много компонентов, которые связаны положением композиции в таблице Datacomponent, которая также содержит внешние ключи компонентов к таблице Component.

Конечной целью является создание списка объектов Datapoint, отфильтрованных по конкретному значению компонента в таблице Datacomponents.

Например, скажем, у нас есть несколько точек данных. Если у нас всего 2 композиции А и В. А содержит 2 элемента АА и ВВ со значениями 30 и 50 соответственно. B содержит 3 элемента AA BBB и CC со значениями 40, 50 и 60 соответственно. Один пример запроса в этом сценарии был бы: - Получить все точки данных с величиной компонента АА более 30.

Поскольку Datacomponent напрямую не связан с Datapoint, я не уверен, как объединить эти две модели. В настоящее время я пытаюсь построить это в get_object_list библиотеки tastypie.

Любая помощь будет высоко оценена.

ответ

1

Вы можете следить за взаимоотношениями на столько уровней, сколько захотите. Не забудьте всегда начинать с класса, объекты которого вам нужны. Для вашего примера запроса это выглядит примерно так:

Datapoint.objects.filter(
    composition__datacomponent__component_value__gte=30, 
    composition__datacomponent__components__name='AA' 
) 
+0

Не знал, что это было так просто! Большое спасибо за ваш ответ :) – javaCity

+0

Еще один вопрос: у меня есть несколько components__name, и каждое из значений компонентов должно быть больше или равно некоторому значению (скажем, 30 в этом случае). Поскольку все таблицы будут соединены, как мне получить только данные с композицией, каждое значение которой составляет gte 30? – javaCity