如何从 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 啊,其实有误会我特地高调device
和device_id
来做出改变。您应该使用device
而不是device_id
,因为Django 会自动附加_id
后缀,因此在您的情况下,您将拥有device_id_id
字段,而且很可能这不是您想要的。以上是关于如何从 django 中的两个不同表中返回数据?的主要内容,如果未能解决你的问题,请参考以下文章