如何从 django 中的两个不同表中返回数据?

Posted

技术标签:

【中文标题】如何从 django 中的两个不同表中返回数据?【英文标题】:How to return data from two different tables in django? 【发布时间】:2020-03-25 19:51:11 【问题描述】:

我的 models.py 中有两个模型。我需要返回一个 json 响应,其中包含来自两个表的数据。 我的视图和序列化程序应该是什么样子?

class Device(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    device_name = models.CharField(max_length=200, null=True, blank=True )
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return str(self.device_name)

class StatusActivity(models.Model):
    OFFLINE = 1
    ONLINE = 2
    STATUS = (
        (OFFLINE, ('Offline')),
        (ONLINE, ('Online')),
    )
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    device_id = models.ForeignKey(Device, related_name='StatusActivity', on_delete=models.CASCADE)
    changed_to = models.PositiveSmallIntegerField(choices=STATUS)
    modified_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return str(self.device_id)

预期响应:

 
    "device_id":"",
    "device_name":"",
    "changed_to":"",
    "modified_at":"",
  

更新: 我将views.py 和serializer.py 设置如下。我正在检查

Serializer.py

class DeviceSerializer(serializers.ModelSerializer):
    class Meta:
        model = Device
        fields = '__all__'

class StatusActivitySerializer(serializers.ModelSerializer):

    class Meta:
        model = StatusActivity
        fields = '__all__'

class ListSerializer(serializers.Serializer):
    # devices = DeviceSerializer(many=True)
    # activities = StatusActivitySerializer(many=True)

    class Meta:
        model = [Device, StatusActivity]
        fields = ['device_id', 'device_name', 'changed_to', 'modified_at']

Views.py

class DeviceListView(generics.ListAPIView):
    queryset = Device.objects.all()
    serializer_class = ListSerializer

class StatusActivityListView(generics.ListAPIView):
    queryset = StatusActivity.objects.all()
    serializer_class = StatusActivitySerializer

【问题讨论】:

你尝试过什么?表现出一些努力 为什么你有 2 个视图?如果你想要一个响应,你应该只有一个视图。 Okey,它应该是什么样子?我仍然无法检索像我上面的问题中描述的数据。你能指出我该怎么做吗? @dirkgroten 首先,您获取的是Device 还是StatusActivity(即在您的url 中传递了哪个pk/id)?为该模型创建序列化程序,然后通过指定 source 手动添加来自另一个模型的字段。 【参考方案1】:

过滤状态活动。你可以参考外键。 例如:

items = []
for statusact in StatusActivity.objects.all():
    items.append(
        "device_id":statusact.device_id.id,
        "device_name":statusact.device_id.device_name,
        "changed_to":statusact.changed_to,
        "modified_at":statusact.modified_at,
    )

【讨论】:

我在 db 中有 3 个条目,但它响应我这个 [ , , ]【参考方案2】:

实际上,您不需要为此设置两个单独的视图,因为您可以轻松地从一个序列化程序类中序列化关系。 看看这个有用的答案:How do I include related model fields using Django Rest Framework?

对于你的情况,你可以这样写:

class StatusActivitySerializer(serializers.ModelSerializer):
    device_name = serializers.CharField(source='device_id.device_name')

    class Meta:
        model = StatusActivity
        fields = ('changed_to', 'modified_at', 'device_id', 'device_name')

注意事项:

    For ForeignKey 字段最好使用device 名称而不是 device_id; related_name arg 应具有用于反向访问的名称。留着它 有意义的,例如status_activities 是个不错的选择。

【讨论】:

非常感谢。它给了我我需要的东西。但我不明白你的第一点。为什么我应该使用 device_name 而不是 device_id? @funnydman @erondem 啊,其实有误会我特地高调devicedevice_id 来做出改变。您应该使用device 而不是device_id,因为Django 会自动附加_id 后缀,因此在您的情况下,您将拥有device_id_id 字段,而且很可能这不是您想要的。

以上是关于如何从 django 中的两个不同表中返回数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何从数据库中的两个不同表中减去?

如何使用触发器从两个不同的表中插入数据

从不同数据库中的两个表中复制(或使用)数据[重复]

如何从两个不同的工作表中使用 LOOKUP?

提交表单时,DJANGO 中的 POST 方法返回“None”

从具有多对多关系 django 的两个表中过滤数据