1
class Employee(db.Model):
  firstname           = db.StringProperty()       
  lastname            = db.StringProperty()       
  address1            = db.StringProperty() 
  timezone            = db.FloatProperty()     #might be -3.5 (can contain fractions)


class TestClassAttributes(webapp.RequestHandler):
  """
  Enumerate attributes of a db.Model class 
  """
  def get(self): 
     for item in Employee.properties(): 
         self.response.out.write("<br/>" + item)
         #for subitem in item.__dict__: 
         #   self.response.out.write("<br/>&nbsp;&nbsp;--" + subitem) 

上記により、変数「item」のプロパティ名のリストが得られます。だったので、私の考えはitem.__dict__うまくいきませんitemでしたstrdb.FloatProperty()というプロパティなど、各プロパティのデータ フィールド タイプを表示するにはどうすればよいtimezoneでしょうか。

GAE = Google App Engine - しかし、同じ答えがどのクラスにも当てはまると確信しています。

ありがとう、ニール・ウォルターズ

4

3 に答える 3

2

「for name, property in Employee.properties().items()」を使用して繰り返します。property 引数は、instanceof を使用して比較できる Property インスタンスです。

于 2009-09-17T21:05:35.837 に答える
1

このような問題には、インタラクティブな Python シェルが非常に便利です。これを使用して Employee オブジェクトを調べていた場合は、試行錯誤を通じて質問に対する答えを見つけた可能性があります。

何かのようなもの:

>>> from groups.models import Group
>>> Group.properties()
{'avatar': <google.appengine.ext.db.StringProperty object at 0x19f73b0>,
 'created_at': <google.appengine.ext.db.DateTimeProperty object at 0x19f7330>,
 'description': <google.appengine.ext.db.TextProperty object at 0x19f7210>,
 'group_type': <google.appengine.ext.db.StringProperty object at 0x19f73d0>}

properties()このことから、オブジェクトのメソッドが、モデルのプロパティ名と、それらが表す実際のプロパティ オブジェクトとのマッピングをdb.Model返すことがわかります。dict

于 2009-09-17T22:14:48.583 に答える
0

同じ問題を追加しましたが、最初の2つの答えは100%役に立ちませんでした。クラスのメタデータやインスタンスプロパティから型情報を取得できませんでしたが、これは奇妙なことです。だから私は辞書を使わなければなりませんでした。

GetType()メソッドは、プロパティのタイプを文字列として返します。

これが私の答えです:

class RFolder(db.Model):
     def GetPropertyTypeInstance(self, pname):
        for name, property in self.properties().items():
            if name==pname:
                return property
        return None

    def GetType(self, pname):
        t = self.GetPropertyTypeInstance(pname)
        return RFolder.__DB_PROPERTY_INFO[type(t)]

    __DB_PROPERTY_INFO = {

        db.StringProperty           :"String",
        db.ByteStringProperty       :"ByteString",
        db.BooleanProperty          :"Boolean",
        db.IntegerProperty          :"Integer",
        db.FloatProperty            :"Float",
        db.DateTimeProperty         :"DateTime",
        db.DateProperty             :"Date",
        db.TimeProperty             :"Time",
        db.ListProperty             :"List",
        db.StringListProperty       :"StringList",
        db.ReferenceProperty        :"Reference",
        db.SelfReferenceProperty    :"SelfReference",
        db.UserProperty             :"User",
        db.BlobProperty             :"Blob",
        db.TextProperty             :"Text",
        db.CategoryProperty         :"Category",
        db.LinkProperty             :"Link",
        db.EmailProperty            :"Email",
        db.GeoPtProperty            :"GeoPt",
        db.IMProperty               :"IM",
        db.PhoneNumberProperty      :"PhoneNumber",
        db.PostalAddressProperty    :"PostalAddress",
        db.RatingProperty           :"Rating"
    }
于 2010-11-22T03:10:54.123 に答える