Django ORM通过多个模型访问用户表

Wil*_*ill 7 django django-orm

views.py

我正在创建一个我想序列化并作为JSON返回的查询集.查询集如下所示:

all_objects = Program.objects.all()
test_data = serializers.serialize("json", all_objects, use_natural_keys=True)
Run Code Online (Sandbox Code Playgroud)

除了"用户"模型(跨两个模型链接)之外,这将拉回所有内容.

models.py

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

class Time(models.Model):
    user = models.ForeignKey(User)
    ...

class CostCode(models.Model):
    program_name = models.TextField()        
    ...

class Program(models.Model):
    time = models.ForeignKey(Time)
    program_select = models.ForeignKey(CostCode)
    ...
Run Code Online (Sandbox Code Playgroud)

我返回的数据有Time,Program和CostCode信息,但我无法查询'User'表.如何在同一个查询集中找回"用户名"(来自用户表)?

注意:我已将我的查询集更改为all_objects = Time.objects.all(),这会获取用户信息,但之后它不会引入"CostCode".我的模型也有ModelManagers返回,get_by_natural_key所以相关字段出现在我的JSON中.

最终,我希望所有四个模型的数据都出现在我的序列化JSON字段中,我只是缺少'用户名'.

这是一张JSON对象当前如何出现在Firebug中的图片: Firefox的Firebug显示了JSON对象

谢谢你的帮助!

Ane*_*pic 3

乍一看似乎有点重量级,但你可以看看使用 Django REST Framework:
http://www.django-rest-framework.org/api-guide/serializers#modelserializer

您可以定义和使用序列化器类,而无需对框架执行任何其他操作。序列化器返回一个 python 字典,然后可以轻松地将其转储为 JSON。

要从每个相关模型中获取所有字段作为嵌套字典,您可以执行以下操作:

class ProgramSerializer(serializers.ModelSerializer):
    class Meta:
        model = Program
        depth = 2

all_objects = Program.objects.all()
serializer = ProgramSerializer(all_objects, many=True)
json_str = json.dumps(serializer.data)
Run Code Online (Sandbox Code Playgroud)

要自定义每个模型包含哪些字段,您需要为每个模型定义一个 ModelSerializer 类,例如仅username输出time.user

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ('username', )

class TimeSerializer(serializers.ModelSerializer):
    """
    specifying the field here rather than relying on `depth` to automatically
    render nested relations allows us to specify a custom serializer class
    """
    user = UserSerializer()

    class Meta:
        model = Time

class ProgramSerializer(serializers.ModelSerializer):
    time = TimeSerializer()

    class Meta:
        model = Program
        depth = 1  # render nested CostCode with default output

all_objects = Program.objects.all()
serializer = ProgramSerializer(all_objects, many=True)
json_str = json.dumps(serializer.data)
Run Code Online (Sandbox Code Playgroud)