Django: Konwersja całego zestawu obiektów modelu w jeden słownik

jeśli przyszedłeś tu z Google szukając modelu do dict, pomiń moje pytanie i po prostu Skocz do pierwszej odpowiedzi. Moje pytanie tylko cię zmyli.

Czy jest dobry sposób w Django, aby cały zestaw obiektów modelu w jednym słowniku? To znaczy Tak:

class DictModel(models.Model):
    key = models.CharField(20)
    value = models.CharField(200)


DictModel.objects.all().to_dict()

... w wyniku czego powstaje słownik z parami klucz/wartość składająca się z rekordów w modelu? Czy ktoś jeszcze widział, że jest to przydatne dla oni?

Dzięki.

Update
Chciałem tylko dodać, że moim ostatecznym celem jest to, aby móc zrobić proste wyszukiwanie zmiennych wewnątrz szablonu. Coś w stylu:
{{ DictModel.exampleKey }}

Z wynikiem dyktatury.obiektów.get (key_ _ exact=exampleKey).wartość

Ogólnie rzecz biorąc, naprawdę Zaskoczyliście mnie tym, jak pomocne są wszystkie Wasze odpowiedzi i jak różne mogą być sposoby podejścia do nich. Wielkie dzięki.

Aktualizacja Październik 2011: To pytanie jest najlepszym wynikiem, jeśli Wygooglujesz "django model_to_dict" , co jest naprawdę okropne, biorąc pod uwagę, że rozwiązuje inny problem niż to, o co pytałem.

Chciałem mieć możliwość mapowania wszystkich wystąpień w zestawie zapytań do jednego słownika z określonym polem modelu jako kluczem.
z drugiej strony model_to_dict konwertuje pojedynczą instancję modelu do słownika.

Teraz, moje potrzeby w tym czasie były dość cholernie konkretne ,i prawdopodobnie niezwykle rzadkie (I nawet nie pamiętam projektu, do którego go potrzebowałem, ani dlaczego). Byłbym więc dość zaskoczony, że każdy, kto szuka informacji na temat model_to_dict, uzna moje pytanie za przydatne. Przepraszam.

model_to_dict wydaje się być o wiele bardziej powszechnym przypadkiem użycia niż miałem.

Aktualizacja Grudzień 2011:
Zmieniłem tytuł, aby lepiej odzwierciedlał moje pierwotne intencje.

Author: LarrikJ, 2009-07-14

12 answers

Czy to musi stworzyć rzeczywisty dict? dasz radę tylko z czymś, co wyglądało jak dict?

class DictModelAdaptor():
    def __init__(self, model):
        self.model = model

    def __getitem__(self, key):
        return self.model.objects.get(key=key)

    def __setitem__(self, key, item):
        pair = self.model()
        pair.key = key
        pair.value = item
        pair.save()

    def __contains__(self, key):
        ...

Możesz następnie owinąć model w ten sposób:

modelDict = DictModelAdaptor(DictModel)
modelDict["name"] = "Bob Jones"

Itd...

 17
Author: SingleNegationElimination,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-14 05:35:57

Możesz również polegać na już napisanym kodzie django ;).

from django.forms.models import model_to_dict
model_to_dict(instance, fields=[], exclude=[])
 212
Author: Arthur Debert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-19 14:24:55

Szukasz wartości członka QuerySet, który pozwala uzyskać listę słowników z zapytania

Zwraca ValuesQuerySet -- a QuerySet który ocenia do listy słowniki zamiast modelu-przykład obiektów. Każdy z tych słowników reprezentuje obiekt, z odpowiadającymi mu klawiszami do nazw atrybutów modelu obiektów.

>>> Blog.objects.values()
[{'id': 1, 'name': 'Beatles Blog', 'tagline': 'All the latest Beatles news.'}],
>>> Blog.objects.values('id', 'name')
[{'id': 1, 'name': 'Beatles Blog'}]
 26
Author: Tom Leys,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-14 03:42:17

Chcesz in_bulk metoda queryset, która według docs:

Pobiera listę wartości pól (id_list) i field_name dla tych wartości i zwraca słownik odwzorowujący każdą wartość na instancję obiektu o podanej wartości pola. Jeśli nie podano id_list, zwracane są wszystkie obiekty w zestawie zapytań. field_name musi być unikalnym polem i domyślnie jest to klucz główny.

To wymaga listy identyfikatorów, więc najpierw musisz ją zdobyć przez values_list "metoda": {]}

ids = MyModel.objects.values_list('id', flat=True)
ids_to_model_instances = MyModel.objects.in_bulk(ids)
# {1: <MyModel: 1>, 2: <MyModel: 2>, 3: <MyModel: 3>}
 17
Author: Daniel Roseman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-08-25 00:33:31

Możesz użyć python serializer :

from django.core import serializers
data = serializers.serialize('python', DictModel.objects.all())
 14
Author: Luper Rouch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-14 10:19:23

Użyj

dict(((m.key, m.value) for m in DictModel.objects.all())

Zgodnie z sugestią Toma Leysa, nie musimy pobierać całego obiektu, możemy uzyskać tylko te wartości, których potrzebujemy, np.

dict(((m['key'], m['value']) for m in DictModel.objects.values('key', 'value')))

I jeśli potrzebujesz wszystkich wartości, lepiej zachować cały obiekt w dict np.

dict(((m.key, m) for m in DictModel.objects.all())
 6
Author: Anurag Uniyal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-14 05:09:03

dict((x.name, getattr(o, x.name)) for x in o._meta.fields)

 6
Author: tug,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-06 23:49:40

Być może czegoś mi brakuje, ale Obiekty Django mają atrybut __dict__, który wydaje się być tym, czego chcesz.

 4
Author: bjw,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-09 12:44:26

Aby pobrać wartości modeli do słownika, dodaj poniższy kod w miejscu, w którym potrzebujesz tego słownika

from models import DictModel

activity_map = dict(Plan.objects.values_list('key', 'value'))

Activity_map jest słownikiem zawierającym wymagane informacje .

 2
Author: eswar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-11 16:16:28
user = mymodel.objects.all()
user.values() 
Możesz również spróbować]}
user.values_list() # getting as list
 2
Author: Rajan Mandanka,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-31 13:10:27

A może próbowałeś zrobić coś takiego:

def someview(req):
    models = MyModel.objects.all()
    toTuple = lambda field: (getattr(field, 'someatt'), getattr(field, 'someotheratt'))  
    data = dict(map(toTuple,models))
    return render_to_response(template, data)
 1
Author: Shea Kauffman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-15 22:18:55

Aby uzyskać mapę wszystkich wystąpień w zestawie zapytań do jednego słownika z podanym polem modelu jako kluczem, spróbuj to zrobić

from django.forms.models import model_to_dict
from myApp.models import myModel

allObjs = myModel.objects.all()
f = {}         # initialise the output
key = 'key'    # one of the fields from myModel

[f.update({x[key]: x}) for x in [model_to_dict(y) for y in allObjs]]
return f
 1
Author: iancoleman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-02 10:47:33