序列化 RAW SQL 查询 Django
Serializing RAW SQL query Django
希望你一切顺利。我需要序列化我的 RAW SQL 查询:
SELECT nn.*,nm.*FROM notifications_newsletter nn LEFT JOIN notifications_message nm ON nn.id=nm.newsletter_id_id ORDER by nm.status DESC
models.py
from django.db import models
class Newsletter(models.Model):
start_datetime = models.DateTimeField()
text = models.TextField(blank=True)
filter = models.ForeignKey('Filter', null=True, on_delete=models.SET_NULL)
end_datetime = models.DateTimeField()
class Message(models.Model):
send_datetime = models.DateTimeField('%Y-%m-%d %H:%M:%S', auto_now=True)
status = models.BooleanField(default=False)
newsletter_id = models.ForeignKey('Newsletter', on_delete=models.CASCADE)
client_id = models.ForeignKey('Client', on_delete=models.CASCADE)
views.py
from django.core.serializers import serialize
from django.http import HttpResponse
from .models import Newsletter
def some_view(request):
sql = 'SELECT nn.*,nm.*FROM notifications_newsletter nn ' \
'LEFT JOIN notifications_message nm ' \
'ON nn.id=nm.newsletter_id_id ORDER by nm.status DESC'
qs = Newsletter.objects.raw(sql)
qs_json = serialize('json', qs)
return HttpResponse(qs_json, content_type='application/json')
如果我使用 serializers.serialize()
响应中不存在所有连接数据(消息 table)。
但是,如果 print(qs.columns)
列 send_datetime、状态等 将被打印。
回复:
[
{
"model": "notifications.newsletter",
"pk": 42,
"fields": {
"start_datetime": "2022-01-21T21:56:09Z",
"text": "This is test message for 900 operator code.",
"filter": 1,
"end_datetime": "2022-01-21T18:00:00Z"
}
},
]
我需要这样的东西:
[
{
"model": "notifications.newsletter",
"pk": 43,
"fields": {
"start_datetime": "2022-01-21T22:03:26Z",
"text": "This is test message for 904 operator code.",
"filter": 2,
"end_datetime": "2022-01-21T18:00:00Z",
"messages": [
{
"send_datetime": "2022-01-21T22:03:26Z",
"status": 0,
"newsletter_id": 43,
"client_id": 1
},
]
}
},
]
是否可以正常序列化?
您可以使用 Django REST Framework 中的嵌套模型序列化程序来达到您的目的:
from rest_framework import serializers
class MessageSerializer(serializers.ModelSerializer):
class Meta:
model = Message
fields = "__all__"
class NewsletterSerializer(serializers.ModelSerializer):
messages = MessageSerializer(many=True)
class Meta:
model = Newsletter
fields = "__all__"
并在您的视图中使用 NewsletterSerializer
:
from django.core.serializers import serialize
from django.http import HttpResponse
from .models import Newsletter
def some_view(request):
sql = 'SELECT nn.*,nm.*FROM notifications_newsletter nn ' \
'LEFT JOIN notifications_message nm ' \
'ON nn.id=nm.newsletter_id_id ORDER by nm.status DESC'
qs = Newsletter.objects.raw(sql)
qs_json = NewsletterSerializer(qs, many=True).data
return HttpResponse(qs_json, content_type='application/json')
您还必须对代码进行一些其他更改:
- 您必须将字段
newsletter_id
、client_id
分别重命名为 newsletter
、client
。您可以阅读更多相关信息 here。
- 您必须在
Message
模型的 newsletter
外键中指定 related_name。像这样将其设置为 messages
:
newsletter = models.ForeignKey('Newsletter', on_delete=models.CASCADE, related_name='messages')
- 您必须重命名您的
filter
字段,因为它是保留关键字。
希望你一切顺利。我需要序列化我的 RAW SQL 查询:
SELECT nn.*,nm.*FROM notifications_newsletter nn LEFT JOIN notifications_message nm ON nn.id=nm.newsletter_id_id ORDER by nm.status DESC
models.py
from django.db import models
class Newsletter(models.Model):
start_datetime = models.DateTimeField()
text = models.TextField(blank=True)
filter = models.ForeignKey('Filter', null=True, on_delete=models.SET_NULL)
end_datetime = models.DateTimeField()
class Message(models.Model):
send_datetime = models.DateTimeField('%Y-%m-%d %H:%M:%S', auto_now=True)
status = models.BooleanField(default=False)
newsletter_id = models.ForeignKey('Newsletter', on_delete=models.CASCADE)
client_id = models.ForeignKey('Client', on_delete=models.CASCADE)
views.py
from django.core.serializers import serialize
from django.http import HttpResponse
from .models import Newsletter
def some_view(request):
sql = 'SELECT nn.*,nm.*FROM notifications_newsletter nn ' \
'LEFT JOIN notifications_message nm ' \
'ON nn.id=nm.newsletter_id_id ORDER by nm.status DESC'
qs = Newsletter.objects.raw(sql)
qs_json = serialize('json', qs)
return HttpResponse(qs_json, content_type='application/json')
如果我使用 serializers.serialize()
响应中不存在所有连接数据(消息 table)。
但是,如果 print(qs.columns)
列 send_datetime、状态等 将被打印。
回复:
[
{
"model": "notifications.newsletter",
"pk": 42,
"fields": {
"start_datetime": "2022-01-21T21:56:09Z",
"text": "This is test message for 900 operator code.",
"filter": 1,
"end_datetime": "2022-01-21T18:00:00Z"
}
},
]
我需要这样的东西:
[
{
"model": "notifications.newsletter",
"pk": 43,
"fields": {
"start_datetime": "2022-01-21T22:03:26Z",
"text": "This is test message for 904 operator code.",
"filter": 2,
"end_datetime": "2022-01-21T18:00:00Z",
"messages": [
{
"send_datetime": "2022-01-21T22:03:26Z",
"status": 0,
"newsletter_id": 43,
"client_id": 1
},
]
}
},
]
是否可以正常序列化?
您可以使用 Django REST Framework 中的嵌套模型序列化程序来达到您的目的:
from rest_framework import serializers
class MessageSerializer(serializers.ModelSerializer):
class Meta:
model = Message
fields = "__all__"
class NewsletterSerializer(serializers.ModelSerializer):
messages = MessageSerializer(many=True)
class Meta:
model = Newsletter
fields = "__all__"
并在您的视图中使用 NewsletterSerializer
:
from django.core.serializers import serialize
from django.http import HttpResponse
from .models import Newsletter
def some_view(request):
sql = 'SELECT nn.*,nm.*FROM notifications_newsletter nn ' \
'LEFT JOIN notifications_message nm ' \
'ON nn.id=nm.newsletter_id_id ORDER by nm.status DESC'
qs = Newsletter.objects.raw(sql)
qs_json = NewsletterSerializer(qs, many=True).data
return HttpResponse(qs_json, content_type='application/json')
您还必须对代码进行一些其他更改:
- 您必须将字段
newsletter_id
、client_id
分别重命名为newsletter
、client
。您可以阅读更多相关信息 here。 - 您必须在
Message
模型的newsletter
外键中指定 related_name。像这样将其设置为messages
:
newsletter = models.ForeignKey('Newsletter', on_delete=models.CASCADE, related_name='messages')
- 您必须重命名您的
filter
字段,因为它是保留关键字。