class Parent(BaseModel):
name = peewee.CharField()
class Child(BaseModel):
name = peewee.CharField()
parent = peewee.ForeignKeyField(Parent, related_name='children')
parent = Parent.create(name="Parent1")
child1 = Child.create(name="Child1", parent=parent)
chilld2 = Child.create(name="Child2", parent=parent)
query = (Parent.select()
.join(Child))
for p in query:
print p.name
for c in p.children:
print "\t",c.name
Это приводит следующий вывод:Peewee возвращает несколько объектов во внутреннем соединении
Parent1
Child1
Child2
Parent1
Child1
Child2
я ожидал:
Parent1
Child1
Child2
Казалось бы, что я итерация через SQL результат в отличие от объекта в смысле ORM. Учитывая, что в запросе есть только один «родительский объект», с точки зрения ORM, как я могу изменить свой запрос или мою итерацию по запросу, чтобы получить ожидаемые результаты?
Я хочу вернуть запрос к моему шаблону, как в примере примера peewee, и просто перебрать его, чтобы отобразить объект, но если я это сделаю, он отобразит один и тот же объект дважды (или n раз для n числа связанных дети).
Я знаю, что я могу сделать следующее:
p = query.get()
print p.name
for c in p.children:
print "\t", c.name
Но когда у меня есть несколько родителей и просто хочу проходные их всех, я не могу определить, сколько родителей есть. Метод запроса count
возвращает счетчик результирующего набора, в отличие от количества их родительских объектов.
Это также работа вокруг:
pars = []
for p in query:
if p not in pars:
pars.append(p)
for p in pars:
print p.name
for c in p.children:
print "\t", c.name
Попробуйте 'запрос = (Child.select() .join (Parent))' и читайте о [join] (https://en.wikipedia.org/wiki/Join_%28SQL%29). Существуют разные виды соединения. Я думаю, что «Естественное соединение» вернет вам набор. Появляется, как вы более осведомлены в этой области. – User