0

私は2つのモデルを定義しています

from django.db import models

class Blog(models.Model):
    title = models.CharField(max_length=144)

    @property
    def posts(self):
        self.Post_set.all()

class Post(models.Model):
    title = models.CharField(max_length=144)
    text = models.TextField()
    blog = models.ForeignKey('Blog')

しかし、問題は、シェルを実行して入力するときです

>>> blog = Blog(title="My blog")
>>> post = Post(title="My first post", text="Here is the main text for my blog post", blog=blog)
>>> blog.posts

エラーが発生します

Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/home/lucas/Programming/Python/Django/djangorestfun/blog/models.py", line 9, in posts
    self.Post_set.all()
AttributeError: 'Blog' object has no attribute 'Post_set'
>>> 

今、私は次の問題を抱えています

>>> from blog.models import *
>>> blog = Blog(title="gewrhter")
>>> blog.save()
>>> blog.__dict__
{'_state': <django.db.models.base.ModelState object at 0x259be10>, 'id': 1, 'title': 'gewrhter'}
>>> blog._state.__dict__
{'adding': False, 'db': 'default'}
>>> post = Post(title="sdhxcvb", text="hdbfdgb", blog=blog)
>>> post.save()
>>> post.__dict__
{'blog_id': 1, 'title': 'sdhxcvb', 'text': 'hdbfdgb', '_blog_cache': <Blog: Blog object>, '_state': <django.db.models.base.ModelState object at 0x259bed0>, 'id': 1}
>>> blog.posts
>>> print blog.posts
None

2回目の更新

だから私はあなたのガイドに従いましたが、まだ何も得られません. さらに、blog.posts でエラーが発生します。

>>> from blog.models import *
>>> blog = Blog(title="asdf")
>>> blog.save()
>>> post = Post(title="asdf", text="sdxcvb", blog=blog)
>>> post.save()
>>> blog.posts
Traceback (most recent call last):
  File "<console>", line 1, in <module>
AttributeError: 'Blog' object has no attribute 'posts'
>>> print blog.all_posts
None
4

2 に答える 2

3

post_set小文字にする必要があります:

self.post_set.all()

アップデート:

したがって、実際にBlog呼び出されたプロパティを作成しpostsて、ブログの投稿のリストを返すことができることがわかります。

class Blog(models.Model):
    title = models.CharField(max_length=144)

    @property
    def posts(self):
        return self.post_set.all() # note the `return`

blog.postsは事実上 のエイリアスになりましたblog.post_set.all()。したがって、次のルックアップが機能するようになりました。

from main.models import *

blog = Blog(title="asdf")
blog.save()

post = Post(title="asdf", text="sdxcvb", blog=blog)
post.save()

blog.posts # returns [<Post: Post object>]

blog.post_set.all() # returns [<Post: Post object>]

最後に、各オブジェクトのディクショナリ値のリストを取得するにblog.postsは、次の方法で操作できます。

list = []
for post in blog.posts:
    list.append(post.__dict__)

list # returns [{'text': u'sdxcvb', 'blog_id': 7L, '_state': <django.db.models.base.ModelState object at 0x10a93c2d0>, 'id': 7L, 'title': u'asdf'}]
于 2013-06-28T18:17:49.433 に答える
0

またはより良い場合は、related_nameを使用してください:

class Post(models.Model):
    title = models.CharField(max_length=144)
    text = models.TextField()
    blog = models.ForeignKey('Blog', related_name="posts")

そして yuo はそれを行うことができます:

from main.models import *

post = Post(title="asdf", text="sdxcvb", blog=blog)
post.posts.create("asdf") #Create it "inline"

blog = Blog(title="another_asdf")
post.posts.add(blog) #Added it (don't need call save method!)

blog.posts.all() # returns [<Post: Post object>]

そして、メソッドを使用します

blog.posts.values() 
# [{'id': 1, 'tile': 'asdf', 'text': 'sdxcvb', 'blog': 'THE_BLOG_ID'}]

希望が役立ちます!

于 2013-06-29T04:16:48.197 に答える