Das Serialisieren von Daten ergibt sich aus der Abfrage mit select_related in json
Wie serialisiere ich die Ausgabe einer Abfrage mit select related in einen JSON? Wenn ich Daten aus der Abfrage mit select_related serialisiere, enthält der resultierende JSON keine verwandten Felddaten.
Tabellenschema.
from django.db import models
class User(models.Model)
username = models.CharField(max_length=30)
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=30)
email = models.CharField(max_length=50)
class Userinfo(models.Model)
userId = models.oneToOneField(User)
userImg = models.TextField()
city = models.CharField(max_length=30)
says = models.CharField(max_length=200)
Abfrage mit select related
from django.core import serializers
json_serializer = serializers.get_serialier("json")()
uinfo = Userinfo.objects.filter(userId=1).select_related('userId')
response = json_serializer.serialize(uinfo, ensure_ascii=False, indent=2, use_natural_keys=True)
Das Ergebnis der Antwort ist
[{
"pk": 1,
"model": "userinfo",
"fields": {
"city": "mycity",
"says": "Hi, its me",
"userImg": "profile_img.png",
"userId": [ "user1" ]
}
}]
während das Ergebnis angenommen wird
[{
"pk": 1,
"model": "userinfo",
"fields": {
"city": "mycity",
"says": "Hi, its me",
"userImg": "profile_img.png",
"userId": [{
"username" : "user1",
"first_name" : "User",
"last_name" : "ls1",
"email" : "[email protected]"
}]
}
}]
Ich habe die Abfrage mithilfe von Werten geändert, anstatt "verwandt" auszuwählen, aber dieser Fehler tritt auf
uinfo = Userinfo.objects.filter(userId=1).values('userImg', 'city', 'says', 'userId__username', 'userId__first_name', 'userId__email')
response = json_serializer.serialize(uinfo, ensure_ascii=False, indent=2, use_natural_keys=True)
Error:
concrete_model = obj._meta.concrete_model
AttributeError: 'dict' object has no attribute '_meta'
Ich habe auch einige Lösungen für Stackoverflow ausprobiert, aber ich habe Fehler während der Serialisierung erhalten
Erste Methode
from rest_framework.renderers import JSONRenderer
uinfo = Userinfo.objects.filter(userId=1).select_related('userId')
response = JSONRenderer().render(uinfo)
und der Typ () von uinfo ist
<class 'django.db.models.query.QuerySet'>
Error:
TypeError: [<Userinfo: Userinfo object>] is not JSON serializable
Zweite Methode:
from rest_framework.renderers import JSONRenderer
uinfo = Userinfo.objects.filter(userId=1).values('userImg', 'city', 'says', 'userId__username', 'userId__first_name')
response = JSONRenderer().render(uinfo)
und der zurückgegebene Typ () von uinfo ist class
<'django.db.models.query.ValuesQuerySet>
Error:
TypeError: [{'userImg': u'profile_img.png', 'city': u'mycity', 'says' : u'Hi, its me' 'userId__username': u'user1', 'userId__first_name': u'user'}] is not JSON serializable
Ich habe auch versucht, das Abfrageergebnis in ein Diktat umzuwandeln (mithttps://djangosnippets.org/snippets/2670/ ) vor der Serialisierung in JSON, aber ich habe den folgenden Fehler
uinfo = Userinfo.objects.filter(userId=1).select_related('userId')
uinfodata = deep_dump_instance(uinfo)
Error:
in deep_dump_instance
if (instance.__class__, instance.pk) in seen:
AttributeError: 'QuerySet' object has no attribute 'pk'