2016-11-17 4 views
0

Я использую Peewee как ОРМ в Python (в сочетании с PostgreSQL), и я пытаюсь запросить каждый потомок данного идентификатора из таблицы с самостоятельным реферированием (родитель-ребенок)Peewee получить все потомкам

Каков наилучший способ достичь этого?

Edit:

Я уже настроить PeeWee класс модели:

class Customer(BaseModel): 
    customerid = PrimaryKeyField() 
    name = CharField(null=False) 
    parentid = ForeignKeyField(db_column='parentid', 
          null=True, 
          rel_model='self', to_field='customerid') 
    customer_type_customertypeid = ForeignKeyField(
     db_column='customer_type_customertypeid', 
     null=False, 
     rel_model=CustomerType, to_field='customertypeid') 

class Meta: 
    db_table = 'customer' 

Теперь я хочу, чтобы запросить каждый ребенок данного клиента по идентификатору и преобразовать его в Словарь

C1 = dbhandler.Customer.alias() 

try: 
    return [model_to_dict(model) for model in 
     C1.select().where(...)] 
except: 
    return {} 

Но я не могу придумать запрос, который бы достиг этого без использования CTE. Но так как у peewee нет поддержки для CTE, у меня нет идей. Я видел, что peewee имеет функцию .raw (..), в которую вы можете поместить реальные sql-запросы, но это просто разрушит преимущество использования ORM.

+0

Лучший способ - следовать их документации и «Как начать», а не просить нас закодировать это для вас. Я ни в коем случае не пытаюсь вас оскорбить, просто эти вещи появляются очень часто, когда пользователи ничего не пробовали или не могут показать нам, что они пробовали. Имея в виду, что у нас нет реального кода, который поможет вам, кроме кода, для всего решения для вас (что вы, возможно, не думаете, что нас спрашивают). Но это то, о чем вы нас спрашиваете). Пожалуйста, покажите нам несколько попыток решить эту проблему, [Минимальный рабочий пример] (http://stackoverflow.com/help/mcve). Добро пожаловать в SO! – Torxed

+0

@Torxed Я добавил некоторый фактический код – TimoTJ

+0

Гораздо лучше, закрыть отзыв втянуто. Это похоже на законный и хороший вопрос, когда кто-то с лучшим пониманием Peewee (похоже, является новой тенденцией) может помочь. Удачи! – Torxed

ответ

0

Возможно, вам захочется выполнить рекурсивное общее табличное выражение. Peewee 2.x пока не поддерживает это, но он находится в версии 3.0, который в настоящее время не выпущен, поскольку у него много изменений, и я не доработал некоторые из API. Сожалею! Пытаюсь понять это.

В любом случае вы можете использовать MyModel.raw ('WITH ...') для запуска рекурсивных CTE и получения экземпляров модели.

+0

Приятно слышать, что это будет особенность нового нового выпуска! – TimoTJ

0

Я не совсем уверен, что полностью понимаю, к какому запросу вы пытаетесь достичь, но похоже, что вы определяете модель с круговыми зависимостями внешнего ключа. В документации есть что сказать об этом Circular Foreign Key Dependencies. Рекомендация заключается в создании промежуточной таблицы для обработки отношений между вашими объектами. Вероятно, это облегчит определение запроса.

Также, вместо использования метода model_to_dict Peewee позволяет вам возвращать объект dict напрямую, а не объект запроса. Попробуйте что-нибудь вроде:

C1.select(...).where(...).dicts() 
+0

Это не круговой внешний ключ, это родительский ребенок. Циркуляр требует, чтобы две модели имели внешний ключ друг к другу. – coleifer

+0

Это действительно отношение родитель-ребенок. Но спасибо за подсказку о прямом возвращении объектов dict! – TimoTJ

Смежные вопросы