créer manuellement un QuerySet Django ou plutôt ajouter manuellement des objets à un QuerySet

fondamentalement, j'ai besoin d'un moyen gracieux pour faire ce qui suit: -

obj1 = Model1.objects.select_related('model2').get(attribute1=value1)
obj2 = Model1.objects.select_related('model2').get(attribute2=value2)
model2_qs = QuerySet(model=Model2, qs_items=[obj1.model2,obj2.model2])

Je ne pense peut-être pas bien, mais faire quelque chose comme ça me semble infiniment stupide.: -

obj1 = Model1.objects.select_related('model2').get(attribute1=value1)
model2_qs = Model2.objects.filter(pk=obj1.model2.pk)

Oui, j'ai besoin de finir avec un QuerySet de Model2 pour une utilisation ultérieure (spécifiquement pour passer à une forme Django).

Dans le premier bloc de code ci-dessus,même si j'utilise filter au lieu de get je vais évidemment avoir un Queseryset de Model1. Les recherches inversées ne sont pas toujours possible dans mon cas.

19
demandé sur chefsmart 2010-08-03 18:23:05

4 réponses

si vous cherchez simplement à créer un queryset d'articles que vous choisissez à travers un processus compliqué non représentatif en SQL, vous pouvez toujours utiliser le __in opérateur.

wanted_items = set()
for item in model1.objects.all():
    if check_want_item(item):
        wanted_items.add(item.pk)

return model1.objects.filter(pk__in = wanted_items)
34
répondu JudoWill 2010-08-03 15:38:02

pour ajouter manuellement des objets à un QuerySet, essayez _result_cache:

objs = ObjModel.objects.filter(...)
len(objs) #or anything that will evaluate and hit the db
objs._result_cache.append(yourObj)

PS: je n'ai pas compris (ou essayé de comprendre) la question de chefsmart mais je crois que cela répond à la question du titre.

15
répondu Arthur 2011-12-19 20:42:54

Vous ne pouvez pas ajouter manuellement des objets à un répertoire. Mais pourquoi ne pas vous mettre dans une liste ?

obj1 = Model1.objects.select_related('model2').get(attribute1=value1)
obj2 = Model1.objects.select_related('model2').get(attribute2=value2)
model2 = list(obj1, obj2)
4
répondu Nicu Surdu 2010-10-28 12:15:35
use d = insp.registered_tasks()
-7
répondu Sh4d 2013-02-07 11:51:11