我正在构建一个 Django 应用程序,该应用程序的模型具有多个
OneToOne
关系:
class MyApp(BaseModel):
site_1 = models.OneToOneField(
Site, on_delete=models.CASCADE, related_name="site1", null=True
)
site_2 = models.OneToOneField(
Site, on_delete=models.CASCADE, related_name="site2", null=True
)
site_3 = models.OneToOneField(
Site, on_delete=models.CASCADE, related_name="site3", null=True
)
def __str__(self):
return self.title
class Meta:
verbose_name = "Main Application"
verbose_name_plural = "Main Application"
我正在尝试创建一个返回包含所有数据的完整 JSON 对象的视图。当我使用
MyApp.objects.all()
创建查询集时,它返回一个仅包含主键的对象:
{
"model": "mesoamerica.mesoamericaapp",
"pk": 1,
"fields": {
"site_1": 1,
"site_2": 2,
"site_3": 3
}
我可以继续手动执行查询,从 json 来回转换,然后手动链接到查询集:
app = MyApp.objects.all().first()
sites = Site.objects.filter(id__in=(app.site_1.pk, app.site_2.pk, app.site_3.pk))
# look up sites and attach data
serializer = JSONSerializer()
app_data = serializer.serialize([app])
site_data = serializer.serialize(sites)
data_dict = json.loads(app_data)
data_dict[0]["fields"]["site_1"] = json.loads(site_data)[0]
data_dict[0]["fields"]["site_2"] = json.loads(site_data)[1]
data_dict[0]["fields"]["site_3"] = json.loads(site_data)[2]
app_data = json.dumps(data_dict)
return HttpResponse(app_data, content_type="application/json")
这给了我我正在寻找的结果。
但是,我想创建一个查询集,通过 pk 获取每个
Site
模型并将它们附加到查询中,而不必自己执行此操作。是否有一个查询集可以做到这一点?
你可以这样做:
def my_app_data(request):
queryset = MyApp.objects.prefetch_related('site1', 'site2', 'site3').all()
# Serialize queryset to JSON
data = serialize('json', queryset)
# Return JSON response
return JsonResponse(data, safe=False)
但是如果您想为您的站点和 myapp 模型编写序列化器类,请检查文档:https://www.django-rest-framework.org/tutorial/1-serialization/