繁体   English   中英

如何在不使用 Django Rest 框架的情况下 output 的外键值

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM