[英]Why doesn't JsonResponse automatically serialize my Django model?
我有以下模型:
class BaseModel(models.Model):
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
class Meta:
abstract = True
class User(AbstractUser):
username = models.CharField(max_length=255, unique=True)
email = models.EmailField(unique=True, null=False)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
class Post(BaseModel):
user = models.ForeignKey(User, on_delete=models.CASCADE)
content_url = models.URLField(null=False)
我希望能夠獲取數據庫中的所有模型。 當我這樣做時:
urlpatterns = [
path("", views.get_all_posts, name="get_all_posts")]
def get_all_posts(request):
return JsonResponse({"posts": Post.objects.all()})
我收到有關JSON序列化的錯誤。 因此,根據其他職位的建議,我這樣做:
def get_all_posts(request):
posts = serializers.serialize('json', Post.objects.all())
return JsonResponse({"posts": json.loads(posts)})
但是然后我得到了一個這樣形狀的物體:
('[{"model": "api.post", "pk": 1, "fields": {"created_at": '
'"2019-05-06T20:22:43.928Z", "updated_at": "2019-05-06T20:22:43.928Z", '
'"user": 1, "content_url": "tmp/posts/None.md"}}]')
你看到這多么荒謬嗎? 要獲得帖子的實際內容,我需要將每個“響應”映射到它的fields
屬性,即使那樣,我仍然缺少主鍵!
我想知道為什么JSON響應接口不像這樣簡單:
def get_all_posts(request):
return JsonResponse({"posts": Post.objects.all()})
看來,要向客戶端提供序列化的JSON,我必須跳過一系列的循環,說實話,這些循環在生產Web框架中不應該存在。
我究竟做錯了什么?
在serialize()
功能中使用format='python'
為:
def get_all_posts(request):
posts = serializers.serialize('python', Post.objects.all())
return JsonResponse({"posts": posts})
使用queryset
values()
/ values_list()
方法進行序列化:
def get_all_posts(request):
return JsonResponse({"posts": Post.objects.values_list()})
它還支持跨域字段,因此不會有嵌套的序列化,這很容易出錯:
def get_all_posts(request):
return JsonResponse({
"posts": Post.objects.values('content_url', 'user__username')
})
但是對於某些復雜的fleid值,它也可能會失敗。 在這種情況下,可以在理解循環中將復雜的類型轉換為簡單的Python類型,或者使用第三方序列化程序(例如DRF或tastypie)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.