0

ユーザーがさまざまな「タイプ」の投稿を作成できるようにする、かなり基本的なモデルがあります。現在、ベース ' Post' タイプから継承するテキスト タイプと写真タイプがあります。

私は現在、2 つの QuerySet をプルTextPostsして連鎖させていますが、これは悪い考えのようです。PhotoPosts

両方のタイプの投稿を一度に単純に照会する方法はありますか? 私がそれ自体で使用.filter()していない理由Postは、私が (おそらく)それからTextPostorPhotoPostオブジェクトを取得する方法を持っていないからです (または私は?)

PS: Post を単独で使用しない場合は、BasePost または Post と呼ぶ方が理にかなっていますか?

class Post(AutoDateTimeModel):
    POST_TYPES = (
        # Linkable Social Networks
        ('TEXT', 'Text'),
        ('PHOTO', 'Photo'),
        ('LINK', 'Link'),
    )

    post_type = models.ForeignKey(ContentType)
    user = models.ForeignKey(User, blank=True, null=True)
    interests = models.ManyToManyField(Interest, related_name='interests')

    class Meta:
        app_label = 'posts'
        ordering = ('-created_at',)

    def save(self, *args, **kwargs):
        if not self.pk:
            self.post_type = ContentType.objects.get_for_model(type(self))
            # import pdb; pdb.set_trace()
        super(Post, self).save(*args, **kwargs)

class TextPost(Post):
    """ Text post model """
    body = models.TextField()

    class Meta:
        app_label = 'posts'

class PhotoPost(Post):
    """ Photo post model. This can contain multiple photos. """
    description = models.TextField()

    class Meta:
        app_label = 'posts'

class Photo(models.Model):
    """ Individual image model, used in photo posts. """
    caption = models.TextField()
    # source_url = models.URLField(blank=True, null=True)
    image = ImageField(upload_to=upload_to)
    post = models.ForeignKey(PhotoPost, blank=True, null=True, related_name='photos')
    user = models.ForeignKey(User, blank=True, null=True, related_name='photos')

    class Meta:
        app_label = 'posts'

    def __unicode__(self):
        return 'Photo Object by: ' + str(self.user.get_full_name())
4

1 に答える 1

2

Post クラスで InheritanceManager を使用して、この素敵なアプリdjango-model-utilsを使用できます。

ドキュメントからの良い例:

from model_utils.managers import InheritanceManager

class Place(models.Model):
    # ...
    objects = InheritanceManager()

class Restaurant(Place):
    # ...

class Bar(Place):
    # ...

nearby_places = Place.objects.filter(location='here').select_subclasses()
for place in nearby_places:
    # "place" will automatically be an instance of Place, Restaurant, or Bar

あなたの状況に適用する:

class Post(AutoDateTimeModel):
    ...
    objects = InheritanceManager()


class TextPost(Post):
    ...

class PhotoPost(Post):
    ...

そして、これはあなたの質問に答えます: 両方のタイプの投稿を一度に単純にクエリする方法はありますか?

今すぐ投稿をクエリして、結果として TextPost と Photopost のインスタンスを取得できます

于 2013-09-13T00:23:46.853 に答える