2011-10-06 7 views
2

현재 RESTful API를 디자인하기 위해 django-tastypie를 사용하고 있습니다. 나는이 문제에 직면하고있어 내 models.py에서django-tastypie : ModelResource를 리소스에 연결

# the RevisionObject retrieve commits info through pysvn 
# This Resource is fully functionnal (RevisionObject code is not here) 
class RevisionResource(Resource): 
    id = fields.CharField(attribute='revision') 
    description = fields.CharField(attribute='message') 
    author = fields.CharField(attribute='author') 
    changed_path = fields.ListField(attribute='changed_paths') 

    class Meta: 
     object_class = RevisionObject 
     allowed_methods = ['get'] 
     resource_name = 'revision' 

class RevisionToApplyResource(ModelResource): 
    #### here's the problem 
    revision = fields.ToManyField(RevisionResource, 'revision') 
    #### 
    class Meta: 
     queryset = RevisionToApply.objects.all() 

을 나는이 :

class RevisionToApply(models.Model): 
    patch = models.ForeignKey(PatchRequest) 
    revision = models.PositiveIntegerField() 
    applied = models.BooleanField(default = False) 

내 문제가 (장고 용) RevisionToApply 모델 개정에 int를 사용한다는 것입니다.

RevisionToApplyResource의 개정 필드를 RevisionResource에 대한 포인터로 사용하려면 어떻게해야합니까? ToXxxxField가 django 모델과 연결하기위한 것이라면, ResourceObject를 삽입하는 완벽한 순간은 무엇입니까?

감사합니다.

class NoForeignKeyToOneField(ToOneField): 
    def dehydrate(self, bundle): 
     try: 
      obj_key = getattr(bundle.obj, self.attribute) 
      foreign_obj = self.to_class().obj_get(pk=obj_key) 
     except ObjectDoesNotExist: 
      foreign_obj= None 

     if not foreign_obj: 
      if not self.null: 
       raise ApiFieldError("The model '%r' has an empty attribute" 
        "'%s' and doesn't allow null value." % (bundle.obj, 
        self.attribute)) 
      return None 

     self.fk_resource = self.get_related_resource(foreign_obj) 
     fk_bundle = Bundle(obj=foreign_obj, request=bundle.request) 
     return self.dehydrate_related(fk_bundle, self.fk_resource) 

답변

2

다음은 어떻게 수행할까요? ToOneField 클래스의 작동 방식을 살펴보면 수화물/탈수 율 메소드 쌍이 실제 관련 인스턴스를 가져 와서 설정하는 것을 알아 챘을 것입니다. ToOneField을 서브 클래스 화하고이 두 메서드를 재정의하면 실제 외래 키없이 Tastypie의 자동화 된 리소스 처리의 이점을 얻을 수 있습니다.

(I 때문에 모델의 ToOneField보다는 ToManyField 말하는 겁니다, 주어진 RevisionToApply는 하나의 개정을 가리킬 수 있습니다 것 같습니다.)

그것은 같은 것을 보일 것이다 :

class NoForeignKeyToOneField(ToOneField): 

    def dehydrate(self, bundle): 
     # Look up the related object manually 
     try: 
      obj_key = getattr(bundle.obj, self.attribute) 
      ### 
      # Get the revision object here. If you want to make it generic, 
      # maybe pass a callable on __init__ that can be invoked here 
      ### 
      foreign_obj = revision_object 
     except ObjectDoesNotExist: 
      foreign_obj = None 
     # The rest remains the same 
     if not foreign_obj: 
      if not self.null: 
       raise ApiFieldError("The model '%r' has an empty attribute '%s' and doesn't allow a null value." % (bundle.obj, self.attribute)) 
      return None 

     self.fk_resource = self.get_related_resource(foreign_obj) 
     fk_bundle = Bundle(obj=foreign_obj, request=bundle.request) 
     return self.dehydrate_related(fk_bundle, self.fk_resource) 

    def hydrate(self, bundle): 
     value = super(NoForeignKeyToOneField, self).hydrate(bundle) 

     if value is None: 
      return value 

     # Here, don't return the full resource, only the primary key 
     related_resource = self.build_related_resource(value, request=bundle.request) 
     return related_resource.pk 

그리고 ToOneField 기본 리소스가 아닌 리소스에서이 필드 유형을 사용하십시오. 나는 그것을 테스트하지 않았지만, 그 접근이 건전하고 단순하며 그것이 완료 될 것이라고 믿습니다.

+0

그것은 탈수 방법을 위해 작동합니다. 팁 주셔서 감사합니다. 나는 아직도 수화물 하나에 문제가있다. – piir

관련 문제