Как получить данные GenericRelation с помощью одного запроса в Django - PullRequest
0 голосов
/ 24 апреля 2020

Моя цель - получить данные GenericRelation с использованием одного запроса и без использования для l oop.

Пример: у меня есть модель клиента и модель адреса

from django.contrib.contenttypes.fields import GenericForeignKey, GenericRelation
from django.contrib.contenttypes.models import ContentType
from django.db import models


class Customer(models.Model):
    name = models.CharField(null=False, blank=False, max_length=255)
    email = models.EmailField(null=False, blank=False, unique=True)
    address = GenericRelation(Address)


class Address(models.Model):
    address1 = models.CharField(max_length=255)
    address2 = models.CharField(max_length=255)
    content_type = models.ForeignKey(ContentType, null=True, blank=True, on_delete=models.DO_NOTHING)
    object_id = models.PositiveIntegerField(null=True, blank=True)
    content_object = GenericForeignKey('content_type', 'object_id')

Ниже традиционный способ архивирования данных GenericRelation

result = []
customer1 = Customer.objects.filter(pk=1)
customer1_obj = Customer.objects.get(pk=1)
address_of_customer1 = customer1_obj.address.all()
cust_data = json.loads(serialize('json', customer1))
addrs_data = json.loads(serialize('json', address_of_customer1))

result.append({
    'customer_data': cust_data[0]['fields'], 
    'address_data': addrs_data[0]['fields']
    })


print('---result---', result)
---result--- [{'customer_data': {'name': 'Aakash', 'email': 'aakash@g.com'}, 'address_data': {'address1': 'Flat 1-2', 'address2': 'Road 1-2', 'content_type': 18, 'object_id': 1}}]

Но это не хорошее решение. Займите слишком много времени, когда идентификаторы находятся в диапазоне тысяч.

Если есть какой-либо другой способ архивировать эти данные. Затем укажите свое решение в комментариях.

Примечание : убедитесь, что в результате запроса получены данные о клиенте и адресе в одном результате. без использования для l oop.

...