如何在不使用Django Rest Framework的情况下输出外键的值 在您的情况下:

问题描述

我对Django发布的Json值有疑问。从views.py序列化对象后,用户输出主键的ID而不是主键的值。我在models.py中尝试了自然键技术。如何获取输出而不是id?

views.py

def load_post(request):
    serials = serialize('json',Post.objects.all().order_by(
        "-id"))
    return JsonResponse(serials,safe=False)

models.py

from django.contrib.auth.models import AbstractUser
from django.db import models

#Natural Key technique 
class UserManager(models.Manager):
    def get_by_natural_key(self,username):
        return self.get(username=username)


class User(AbstractUser):
    objects = UserManager()


class Post(models.Model):
    id = models.AutoField(primary_key=True)
    user = models.ForeignKey(
        'User',on_delete=models.CASCADE,related_name='user')
    post = models.TextField(max_length=280,blank=True)
    timestamp = models.DateTimeField(auto_Now_add=True)
    likes = models.IntegerField(default=0)

    def __str__(self):
        return f"id: {self.id},username: {self.user},post: {self.post},datetime: {self.timestamp},likes: {self.likes}"

Json输出

[
   {
      "model":"network.post","pk":3,"fields":{
         "user":1,#This should be a username
         "post":"afefawfawefawf","timestamp":"2020-08-07T14:38:54.444Z","likes":0
      }
   },{
      "model":"network.post","pk":2,"timestamp":"2020-08-07T14:38:18.687Z","pk":1,"fields":{
         "user":2,#This should be a username
         "post":"sfoawefoawemfowf","timestamp":"2020-08-07T14:28:09.784Z","likes":0
      }
   }
]

解决方法

如果您希望内置的Django序列化程序输出自然键,则需要另外两件事:

  • natural_key()模型上实施User方法
  • use_natural_foreign_keys=True添加到对serialize()的呼叫中

此过程在Django文档中进行了描述:https://docs.djangoproject.com/en/3.1/topics/serialization/#serialization-of-natural-keys

在您的情况下:

models.py

...

class User(AbstractUser):
    objects = UserManager()
    
    def natural_key(self):
        return self.username

...

views.py

def load_post(request):
    serials = serialize('json',Post.objects.all().order_by("-id"),use_natural_foreign_keys=True)
    return JsonResponse(serials,safe=False)

get_by_natural_key()方法未用于序列化,但需要使用其中的自然键对数据进行反序列化。