1

ビューでアクセスできないように見えるメソッドを使用して、Django にモデルがあります。モデルは次のとおりです。

class Realtor(models.Model):
    user = models.OneToOneField(User)
    team = models.ForeignKey(RealtorTeam, blank=True, null=True, default=None)
    is_showing_realtor = models.BooleanField(default=False)
    is_listing_realtor = models.BooleanField(default=False)

    def type(self):
        if self.is_showing_realtor and self.is_listing_realtor:
            return 'Showing and Listing'
        elif self.is_showing_realtor:
            return 'Showing'
        elif self.is_listing_realtor:
            return 'Listing'
        else:
            return ''

ここで、ビューで、次のように、メソッドを含むモデルをクエリしようとします。

q = Realtor.objects.all()
q = q.filter(user__first_name__icontains=first)
q = q.filter(user__last_name__icontains=last)
q = q.filter(team__name__icontains=team)
q = q.filter(user__email__icontains=email)
q = q.filter(type__icontains=type)

私が得るエラーはですCannot resolve keyword 'type' into field. Choices are...。私はいくつかのstackoverflowの質問を調べ、Djangoのドキュメントをさらに読んで、モデルに次のようなフィールドを追加することを確認しました:

type_display = (type,)

しかし、それはうまくいきませんでした。is_showing_realtor と is_listing_realtor を照会する必要がありますか? メソッドを照会する方法はありませんか?

より詳しい情報

モデルのテーブルを表示するために Django_tables2 を使用しています。type次のように、それを使用してメソッドにアクセスできます。

class RealtorTable(tables.Table):
    id = tables.Column()
    first_name = tables.Column(accessor='user.first_name', order_by='user.first_name')
    last_name = tables.Column(accessor='user.last_name', order_by='user.last_name')
    team = tables.Column()
    email = tables.Column(accessor='user.email', order_by='user.email')
    type = tables.Column(order_by='is_showing_realtor')

それでも、それをビューに渡すことはできません。

4

2 に答える 2

2

type組み込み関数pythonの名前であり、django でも同様です。listing_type衝突を避けるために、関数の名前を変更することをお勧めします。

特に、この行

type_display = (type,)

おそらくあなたが思っていることをしていないでしょう。

reptilicusは正しいです。フィールド以外の属性にフィルターを見つけていませんでした。これは意味がありません。withセットにlisting_type変換し、モデルが変更されたときにそれを設定するカスタムロジックを使用することもできます。CharFieldchoices=save()property

@def listing_type():
    doc = "The listing_type property."
    def fget(self):
        if self.is_showing_realtor and self.is_listing_realtor:
            return 'Showing and Listing'
        elif self.is_showing_realtor:
            return 'Showing'
        elif self.is_listing_realtor:
            return 'Listing'
        else:
            return ''
    def fset(self, value):
        self._listing_type = value
    def fdel(self):
        del self._listing_type
    return locals()
listing_type = property(**listing_type())

PS私はまだ好きではありませんtype:-)

于 2013-02-05T18:01:16.840 に答える
1

私は Django の専門家ではありませんが、データベース内の列ではないモデル属性に対してクエリを実行できないことは確かです。これは、あなたがやろうとしていることです。おそらく@property、属性のようにするためにメソッドを装飾してみてください。

好きな場合は、リスト内包表記を行うことができます

results = [m for m in query_set if m.type = "Showing and listing"]
于 2013-02-05T18:18:38.517 に答える