![](/img/trans.png)
[英]How to use Django REST framework with a model with default value for foreign key?
[英]How to output the value of the foreign key without using Django Rest Framework
我对 Django 发布的 Json 值有疑问。 在我从 views.py 序列化我的 object 后,用户输出主键的 id 而不是主键的值。 我在 models.py 中尝试了自然键技术。 如何获取值 output 而不是 id?
视图.py
def load_post(request):
serials = serialize('json', Post.objects.all().order_by(
"-id"))
return JsonResponse(serials, safe=False)
模型.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 output
[
{
"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,
"fields":{
"user":1, #This should be a username
"post":"afefawfawefawf",
"timestamp":"2020-08-07T14:38:18.687Z",
"likes":0
}
},
{
"model":"network.post",
"pk":1,
"fields":{
"user":2, #This should be a username
"post":"sfoawefoawemfowf",
"timestamp":"2020-08-07T14:28:09.784Z",
"likes":0
}
}
]
如果您希望通过内置 Django 序列化程序将自然键设为 output,则需要另外两件事:
User
model 上实现natural_key()
方法use_natural_foreign_keys=True
添加到对serialize()
的调用该过程在此处的 Django 文档中进行了描述: https://docs.djangoproject.com/en/3.1/topics/serialization/#serialization-of-natural-keys
模型.py
...
class User(AbstractUser):
objects = UserManager()
def natural_key(self):
return self.username
...
视图.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()
方法不用于序列化,但需要反序列化包含自然键的数据。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.