0
class TimeStampedModel(models.Model):
    created = DateTimeField(_('created'), auto_now=False, auto_now_add=True)
    modified = DateTimeField(_('modified'), auto_now=True, auto_now_add=False)

    class Meta:
        abstract = True


class TimeFramedModel(models.Model):
    start = models.DateTimeField(_('start'), null=True, blank=True)
    end = models.DateTimeField(_('end'), null=True, blank=True)

    class Meta:
        abstract = True


class EntryQueryset(QuerySet):

    def published(self):
        return self.filter(self.status == 'published')


class EntryManger(models.Manager):

    def get_query_set(self):
        print 'using right custom manager'
        return EntryQueryset(self.model, using=self._db)

class Entry(TimeStampedModel, TimeFramedModel):

    status = models.CharField(
        _('status'), choices=STATUS_CHOICES, max_length=16,
        default='draft')
    objects = EntryManger()

するとEntry.objects.published()、エラーが発生します。'EntryManger'オブジェクトに属性'published'がないことを訴えます。

「適切なカスタムマネージャを使用する」というテキストは印刷されませんでした。

このエラーの原因は何ですか?ありがとうございました!

4

2 に答える 2

1

Entry.objectsはマネージャであり、クエリセットではありません。publishedカスタムクエリセット内に配置するため、次のことを行う必要がありEntry.objects.all().published()ます。Entry.objects.get_queryset().published()

publishedまた、正しく実装されていません。次のようになります。

class EntryQueryset(QuerySet):

    def published(self):
        return self.filter(status='published')
于 2013-03-23T04:43:26.487 に答える
0

メソッドpublished()はEntryManagerクラスにある必要があり、新しいQuerySetクラスを作成する必要はありません(通常、データベースからデータをフェッチする方法をさらに深く掘り下げたい場合にのみ使用します)。

正しい解決策は次のとおりです。

class EntryManger(models.Manager):
    def published(self):
        print 'using right custom manager'
        return self.filter(self.status == 'published')

EntryQuerySetクラスを完全に削除できます。

于 2013-03-23T04:29:37.367 に答える