Загрузка данных из модели в 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>>.

Вернуться на верх