2013-05-14 3 views
0

У меня есть две унаследованные модели, перечисленные ниже. Library.libtype_idэффективно внешний ключ к LibraryType, когда libtype_id> 0. Я хочу представить это как ресурс ForeignKey в TastyPie, когда это условие выполнено.Tastypie - Ссылка на «ForeignKey»

Может кто-нибудь помочь мне? Я видел this, но я не уверен, что это то же самое? Большое спасибо!!

# models.py 
class LibraryType(models.Model): 
    id = models.AutoField(primary_key=True) 
    name = models.CharField(max_length=96) 

class Library(models.Model): 
    id = models.AutoField(primary_key=True) 
    name = models.CharField(max_length=255) 
    project = models.ForeignKey('project.Project', db_column='parent') 
    libtype_id = models.IntegerField(db_column='libTypeId') 

Вот мой api.py

class LibraryTypeResource(ModelResource): 

    class Meta: 
     queryset = LibraryType.objects.all() 
     resource_name = 'library_type' 

class LibraryResource(ModelResource): 
    project = fields.ForeignKey(ProjectResource, 'project') 
    libtype = fields.ForeignKey(LibraryTypeResource, 'libtype_id') 

    class Meta: 
     queryset = Library.objects.all() 
     resource_name = 'library' 
     exclude = ['libtype_id'] 

    def dehydrate_libtype(self, bundle): 
     if getattr(bundle.obj, 'libtype_id', None) != 0: 
      return LibraryTypeResource.get_detail(id=bundle.obj.libtype_id) 

Когда я делаю это, однако я получаю следующее сообщение об ошибке на http://0.0.0.0:8001/api/v1/library/?format=json

"error_message": "'long' object has no attribute 'pk'", 

ответ

1

В случае, если не

libtype = fields.ForeignKey(LibraryTypeResource, 'libtype_id') 

be

libtype = fields.ForeignKey(LibraryTypeResource, 'libtype') 

(без «_id»)

Я считаю, что, как это вы отдаете поле int и пытается получить pk от него.

ОБНОВЛЕНИЕ:

Missed, что libtype_id является IntegerField, не ForeignKey (вся суть вопроса)

Лично я хотел бы добавить метод к Library для извлечения LibraryType объекта. Таким образом, у вас есть доступ к LibraryType от Library, и вам не нужно переопределять любые методы dehydrate.

class Library(models.Model): 
    # ... other fields 
    libtype_id = models.IntegerField(db_column='libTypeId') 

    def get_libtype(self): 
     return LibraryType.objects.get(id=self.libtype_id) 

.

class LibraryResource(ModelResource): 
    libtype = fields.ForeignKey(LibraryTypeResource, 'get_libtype') 
+0

Это немного лучше .. но теперь у меня есть проблема с моей get_detail. Как я должен ссылаться на это - я хочу ури? – rh0dium

+0

Я не совсем уверен, что понимаю. Вам нужно 'dehydrate_libtype' вообще? – rockingskier

+0

Как это соотносится с конкретным идентификатором ресурса? – rh0dium

Смежные вопросы