@@ -197,7 +197,12 @@ class RelatedList(atomclist):
197197
198198 __slots__ = ()
199199
200- async def load (self ) -> list :
200+ def sort (self , * , key = None , reverse = False ):
201+ # AtomCListHandler calls super(type(self), self).sort which causes a loop
202+ # in a loop because we fiddle with the __class__
203+ super (atomclist , self ).sort (key = key , reverse = reverse )
204+
205+ async def load (self , inplace : bool = True ) -> list :
201206 """Returns a list of the related values."""
202207 Model = cast (Type [SQLModel ], type (owner ))
203208 ThroughModel = relation .through
@@ -234,38 +239,45 @@ async def load(self) -> list:
234239 f"relation between { Model } and through model { ThroughModel } "
235240 f": Tried { Model .__backrefs__ } "
236241 )
237- return [
242+ items = [
238243 getattr (row , relation_backref .name )
239244 for row in await ThroughModel .objects .select_related (
240245 relation_backref .name
241246 ).filter (** {owner_backref .name : owner })
242247 ]
243- # A many to one relation case. For example:
244- #
245- # class Page(SQLModel):
246- # comments = Relation(lambda: Comment)
247- # class Comment(SQLModel):
248- # page = Instance(Page)
249- #
250- # When we have:
251- # comments = await page.comments.load()
252- # The page is the owner, and the comments member is the relation.
253- # So inlining it will be the same as the following:
254- # comments = await Comments.objects.filter(page=page)
255- owner_backref = resolve_backref (Model , RelModel )
256- if owner_backref is None :
257- raise UnresolvableError (
258- f"relation between { Model } and { RelModel } "
259- f": Tried { Model .__backrefs__ } "
260- )
261- return await RelModel .objects .filter (** {owner_backref .name : owner })
248+ else :
249+ # A many to one relation case. For example:
250+ #
251+ # class Page(SQLModel):
252+ # comments = Relation(lambda: Comment)
253+ # class Comment(SQLModel):
254+ # page = Instance(Page)
255+ #
256+ # When we have:
257+ # comments = await page.comments.load()
258+ # The page is the owner, and the comments member is the relation.
259+ # So inlining it will be the same as the following:
260+ # comments = await Comments.objects.filter(page=page)
261+ owner_backref = resolve_backref (Model , RelModel )
262+ if owner_backref is None :
263+ raise UnresolvableError (
264+ f"relation between { Model } and { RelModel } "
265+ f": Tried { Model .__backrefs__ } "
266+ )
267+ items = await RelModel .objects .filter (** {owner_backref .name : owner })
268+
269+ if inplace :
270+ for item in items :
271+ if item not in self :
272+ self .append (item )
273+ return items
262274
263275 async def save (self , connection = None ):
264276 """Save the current list as the complete set of related items. This
265277 should only be used for small sets of items.
266278 """
267279 current = set (self )
268- saved = set (await self .load ())
280+ saved = set (await self .load (inplace = False ))
269281 ThroughModel = relation .through
270282 RelModel = relation .to
271283 if ThroughModel is not None :
0 commit comments