Загрузка данных из модели в view.py Django
Я только начал работать с Django и Python и все еще не очень хорошо понимаю его. Можно ли получить доступ ко всей информации, хранящейся в Persons, показывая также orderstext и archivename, у меня не получается это сделать: ( моя идея состоит в том, чтобы получить всю информацию и сохранить ее как JSON, но я не получаю информацию из orderstext и archivename, было бы здорово, если бы кто-нибудь мог показать мне правильный путь.
models.py
from django.db import models
class Order(models.Model):
order_id = models.PositiveIntegerField(blank=True, null=True)
orderstext = models.CharField(max_length=250, blank=True, null=True, )
order_start = models.DateTimeField(blank=True, null=True)
order_end = models.DateTimeField(blank=True, null=True)
@property
def default(self):
return self.orderstext
class Meta:
managed = False
db_table = 'order'
class Archives(models.Model):
archive_id = models.AutoField(primary_key=True, null=False)
archivename = models.CharField(max_length=50, unique=True, blank=True, null=True)
deleted = models.IntegerField(blank=True, null=True)
def __str__(self):
return self.archivename
@property
def default(self):
return self.archivename
class Meta:
managed = False
db_table = 'archives'
class Clients(models.Model):
name = models.CharField(max_length=20, verbose_name="Name")
lastname = models.CharField(max_length=50, blank=True, null=True, verbose_name="Lastname")
archives = models.ForeignKey('Archives', db_column='archive_id', on_delete=models.CASCADE, null=True, verbose_name="Archives")
order = models.ForeignKey('Order', db_column='order_id', on_delete=models.CASCADE, null=True, verbose_name="Order")
coments = models.CharField(max_length=250, blank=True, null=True, verbose_name="Coments")
class Meta:
managed = False
db_table = 'clients'
views.py
from django.http import JsonResponse
from .models import Clients
def data_json:
info = list(Clients.objects.all().values())
response = {'clients': info}
return JsonResponse(response)
urls.py
from django.urls import path
from . import views
urlpatterns = [
path('clients-info/', views.data_json, name='data_json'),
]
JSON Response
{
"clients": {
"id": 4,
"name": "First",
"lastname": "Last Name",
"archive_id": 6,
"order_id": 3,
"coments": "No comments"
}
}
Если я правильно понимаю, вы хотите получить данные определенного поля FK
на каждом клиентском объекте, но то, что вы получаете, это pk
значение моделей Order
и Archive
на каждом Client
объекте.
{
"clients": {
"id": 4,
"name": "First",
"lastname": "Last Name",
"archive_id": 6, # foreign key pk field reference
"order_id": 3, # foreign key pk field reference
"coments": "No comments"
}
}
Если я прав, то один из подходов, который вы можете использовать, это изменить имя ссылки, чтобы ссылаться на поля orderstext
и archivename
соответственно вместо order_id
и archive_id
.
Так что я бы не стал менять ничего другого, кроме двух полей foreign key
на Client model
. Обновление ссылки, где db_column
указывает:
class Clients(models.Model):
...
archives = models.ForeignKey('Archives', db_column='archivename', on_delete=models.CASCADE, null=True, verbose_name="Archives")
order = models.ForeignKey('Order', db_column='orderstext', on_delete=models.CASCADE, null=True, verbose_name="Order")
...
Подробнее можно прочитать в документе db-column.
Вы можете annotate
...[Django-doc] клиентский кверисет с orderstext
и archivename
рядом F-expressions
...[Django-doc] вот так:
from django.db.models import F
Clients.objects.annotate(
archivename=F("archives__archivename"),
orderstext=F("order__orderstext"),
).values()
Хотя вместо использования values
я настоятельно рекомендую использовать что-то вроде DRF serializers
...[DRF-doc] для обработки сериализации ваших данных.
В этом вопросе 12-летней давности есть несколько ответов. Я считаю, что больше одного из них может решить вашу проблему.
Ниже один пример решения:
from django.http import JsonResponse
from django.core.serializers import serialize
from .models import Clients
def data_json(request):
info = Clients.objects.all()
response = serialize('json', info)
return JsonResponse(response, safe=False)
Рекомендую прочитать документацию об объектах запросов и ответов JSON и форматах сериализации <4>>.