Джанго, Монгодб, Тастипи-нонрел: Список иностранных ключей - PullRequest
3 голосов
/ 24 февраля 2012

В моей модели Django-mongodb я хотел бы иметь объект с полем listField, содержащим ссылку на другие объекты. Вот пример того, чего я хочу достичь:

models.py

class Comment(models.Model):
    title = models.CharField(max_length=50)
    body = models.CharField(max_length=50)

class Post(models.Model):
    name = models.CharField(max_length=50)
    commentList = ListField(models.ForeignKey(Comment))

api.py (Tastypie Resources)

class CommentResource(MongoResource):    
    class Meta:
        object_class = Comment
        queryset = Comment.objects.all()
        resource_name = 'comment'
        authentication = Authentication()
        authorization = Authorization()

class PostResource(MongoResource):
    commentList = ListField(models.ForeignKey('CommentResource', 'commentList')   #Wrong but just the expression of my incomprehension.
    class Meta:
        object_class = Post
        queryset = Post.objects.all()
        resource_name = 'post'
        authentication = Authentication()
        authorization = Authorization()

В этом примере поле «commentList» содержит список «Object ID», ссылающийся на объекты «Comment». Если ничего не сделать, HTTP GET на моем ресурсе "Post" выдаст мне:

[...],
objects: [
{
id: "4f47b159c789550388000000",
name: "Hello World",
commentList: "[u'4f47b14ec789550387000000']",
resource_uri: "/api/v1/post/4f47b159c789550388000000/"
}
]

Что бы я хотел получить, это:

[...],
objects: [
{
id: "4f47b159c789550388000000",
name: "Hello World",
commentList: 
[
    comment:{
        title : "My comment title",
        body : "It would be great if tastypie-nonrel could do this!",
        resource_uri: "/api/v1/comment/454f4v59c789550388051486/"
    }
],
resource_uri: "/api/v1/post/4f47b159c789550388000000/"
}
]

У меня такой вопрос: как мне разрешить ссылку на объекты Комментарий и сделать ее доступной с помощью вызова API для ресурса Сообщение ?

Если это невозможно, то как лучше всего спроектировать мою нереляционную модель данных, чтобы сообщение могло содержать несколько комментариев , но это комментариев можно получить доступ к alo самостоятельно и обновлять самостоятельно?

Большое спасибо за вашу помощь !!

1 Ответ

1 голос
/ 21 июля 2012

Попробуйте настроить функцию обезвоживания PostResource следующим образом:

class PostResource(MongoResource):
    commentList = ListField(models.ForeignKey('CommentResource', 'commentList')
    class Meta:
        object_class = Post
        queryset = Post.objects.all()
        resource_name = 'post'
        authentication = Authentication()
        authorization = Authorization()

    def dehydrate(self, bundle):
        cmt_res = CommentResource()
        cmt_bundles = [cmt_res.build_bundle(c) for c in bundle.obj.commentList]
        for cb in cmt_bundles:
            cmt_res.full_dehydrate(cb)
        bundle.data['commentList'] = cmb_bundles
...