问题描述
我对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()
方法未用于序列化,但需要使用其中的自然键对数据进行反序列化。