2012-01-27 3 views
2

django serializer를 사용하여 여러 객체를 직렬화하지만 문제는 각 serialize가 객체에서 가져 오는 대신 db에서 원하는 키의 ID를 쿼리합니다.django serializer forign 키 id에 대한 db를 쿼리합니다.

class QBAccount(CompanyModel): 
    company = models.ForeignKey(Company) 

>>> from deretoapp.models import QBAccount 
>>> import logging 
>>> l = logging.getLogger('django.db.backends') 
>>> l.setLevel(logging.DEBUG) 
>>> l.addHandler(logging.StreamHandler()) 
>>> a = QBAccount.allobjects.all()[0] 
>>> from django.core import serializers 
>>> serializers.serialize('python', [a]) 
(0.000) SELECT `deretoapp_company`.`id`, ... FROM `deretoapp_company` WHERE `deretoapp_company`.`id` = 45995613-adeb-488f-9556-d69e856abe5f ; args=(u'45995613-adeb-488f-9556-d69e856abe5f',) 
[{'pk': u'3de881eb-8409-4089-8de8-6e24f7281f37', 'model': u'deretoapp.qbaccount', 'fields': {... 'company': u'45995613-adeb-488f-9556-d69e856abe5f' ....}}] 

장고 코드를 수정하지 않고이 동작을 변경하는 방법이 있습니까? 나는 a.company.id이 당신은 Natural Keys를 사용하여 직렬화해야 dB에게

>>> django.VERSION 
(1, 3, 1, 'final', 0) 

답변

0

을 조회하지 않습니다 a.company_id 같은 무언가를하도록 (이상적인 세계에서 일어나지한다)하지만 시리얼의 옵션이 회사의 테이블을 쿼리 알고 있습니다.

class Person(models.Model): 
    objects = PersonManager() 

    first_name = models.CharField(max_length=100) 
    last_name = models.CharField(max_length=100) 

    birthdate = models.DateField() 

    def natural_key(self): 
     return (self.first_name, self.last_name) 

    class Meta: 
     unique_together = (('first_name', 'last_name'),) 
:

기본적으로,이 문서부터 PK

의 장소에서, 당신은 오히려 것 필드를 반환하는 외래 키 참조 모델에 natural_key라는 방법을 정의하는 당신을 필요로

을 입력 한 다음 직렬화 중에 use_natural_keysTrue으로 설정하십시오.

다시, 문서에서 : 그것은 대신 직접 DB

from django.core.serializers.python import Serializer as PythonSerializer 
from django.core.serializers.python import Deserializer 

class Serializer(PythonSerializer): 
    internal_use_only = False 

    def handle_fk_field(self, obj, field): 
     if not self.use_natural_keys: 
      # directly get the id 
      self._current[field.name] = getattr(obj, field.attname) 
      return 

     return super(Serializer, self).handle_fk_field(obj, field) 

에서 그것을 얻는 객체의 ID를 참조 가도록 (듯이)

>>> serializers.serialize('json', [book1, book2], indent=2, use_natural_keys=True) 
+0

이 DB를 쿼리를 피하지 않으며 나는'ID 즉 pk' 자연스럽지 키를 원하는 –

1

나는 경우 확실하지 않다 장고 파이썬 시리얼을 수정 결국 모든 ForeighKey usecase를 처리하지만 단순한 경우와 같이 작동합니다. company = models.ForeignKey(Company)

seria를 등록해야합니다. lizer는

SERIALIZATION_MODULES = { 'python' : 'myapp.serializers.python' } 

settings.py에서 나는 또한 지금 장고 트렁크에 고정되어 이것에 대한 bug을 제기했다. 내가 추가 쿼리를 피하기 위해 뭘 오전 see changset

0

중 하나를 매우 효율적이지 보이지만 트릭을 수행합니다 초기 쿼리에서 관련 개체를로드 원래의 검색어에 select_related(...)를 추가합니다.

예를 들어

:

a = QBAccount.allobjects.select_related('company').all()[0]