2009-12-01 146 views
1

基本帳戶在python中如何檢查一個對象是否有值?

class BaseAccount(models.Model): 
user = models.ForeignKey(User, unique=True) 

def __unicode__(self): 
    """ 
    Return the unicode representation of this customer, which is the user's 
    full name, if set, otherwise, the user's username 
    """ 
    fn = self.user.get_full_name() 
    if fn: 
     return fn 
    return self.user.username 

def user_name(self): 
    """ 
    Returns the full name of the related user object 
    """ 
    return self.user.get_full_name() 

def email(self): 
    """ 
    Return the email address of the related user object 
    """ 
    return self.user.email 

def is_store(self): 
    #try: 
    # self.user.is_store 
    # return True 
    #except ObjectDoesNotExist: 
    # return False 
    return self.user.is_store 

def is_professional(self): 
    try: 
     self.user.is_professional 
     return True 
    except ObjectDoesNotExist: 
     return False 

賬戶類

class Account(BaseAccount): 
    """ 
    The account is an extension of the Django user and serves as the profile 
    object in user.get_profile() for shop purchases and sessions 
    """ 
    telephone = models.CharField(max_length=32) 
    default_address = models.ForeignKey(Address, related_name='billing_account', blank=True, null=True) 
    security_question = models.ForeignKey(SecurityQuestion) 
    security_answer = models.CharField(max_length=200) 
    how_heard = models.CharField("How did you hear about us?", max_length=100) 
    feedback = models.TextField(blank=True) 
    opt_in = models.BooleanField("Subscribe to mailing list", help_text="Please tick here if you would like to receive updates from %s" % Site.objects.get_current().name) 
    temporary = models.BooleanField() 

def has_placed_orders(self): 
    """ 
    Returns True if the user has placed at least one order, False otherwise 
    """ 
    return self.order_set.count() > 0 

def get_last_order(self): 
    """ 
    Returns the latest order that this customer has placed. If no orders 
    have been placed, then None is returned 
    """ 
    try: 
     return self.order_set.all().order_by('-date')[0] 
    except IndexError: 
     return None 

def get_currency(self): 
    """ 
    Get the currency for this customer. If global currencies are enabled 
    (settings.ENABLE_GLOBAL_CURRENCIES) then this function will return 
    the currency related to their default address, otherwise, it returns 
    the site default 
    """ 
    if settings.ENABLE_GLOBAL_CURRENCIES: 
     return self.default_address.country.currency 
    return Currency.get_default_currency() 
currency = property(get_currency) 

def get_gateway_currency(self): 
    """ 
    Get the currency that an order will be put through protx with. If protx 
    currencies are enabled (settings.ENABLE_PROTX_CURRENCIES), then the 
    currency will be the same returned by get_currency, otherwise, the 
    site default is used 
    """ 
    if settings.ENABLE_PROTX_CURRENCIES and settings.ENABLE_GLOBAL_CURRENCIES: 
     return self.currency 
    return Currency.get_default_currency() 
gateway_currency = property(get_gateway_currency) 

地址類

class Address(models.Model): 
""" 
This class encapsulates the data required for postage and payment mechanisms 
across the site. Each address is associated with a single store account 
""" 
trade_user = models.BooleanField("Are you a stockist of Neal & Wolf Products", help_text="Please here if you are a Neal & Wolf Stockist") 
company_name = models.CharField(max_length=32, blank=True) 
line1 = models.CharField(max_length=200) 
line2 = models.CharField(max_length=200, blank=True) 
line3 = models.CharField(max_length=200, blank=True) 
city = models.CharField(max_length=32) 
county = models.CharField(max_length=32) 
postcode = models.CharField(max_length=12) 
country = models.ForeignKey(Country) 
account = models.ForeignKey('Account') 

class Meta: 
    """ 
    Django meta options 

    verbose_name_plural = "Addresses" 
    """ 
    verbose_name_plural = "Addresses" 

def __unicode__(self): 
    """ 
    The unicode representation of this address, the postcode plus the county 
    """ 
    return ', '.join((self.postcode, str(self.county))) 

def line_list(self): 
    """ 
    Return a list of all of this objects address lines that are not blank, 
    in the natural order that you'd expect to see them. This is useful for 
    outputting to a template with the aid of python String.join() 
    """ 
    return [val for val in (self.line1, self.line2, self.line3, self.city, self.county, self.postcode, self.country.name) if val] 

能看到三個班,我的問題是很容易怎樣才能知道是否用戶,是一個交易用戶(此值彙總在地址類中)

感謝

+1

你應該改變你的問題的主題;沒有價值的Python對象的概念有點神祕。 – 2009-12-01 20:55:06

回答

5

如果Account類是用戶配置文件,因爲它的文檔字符串建議,那麼你應該能夠做這樣的事情:

is_trade_user = user.get_profile().default_address.trade_user 

如果一個行業用戶的定義是「有一個默認地址進行trade_user是真正的」

在另一方面,如果行業用戶的定義是‘有任何地址進行trade_user是真實的’,那麼你就需要做一些更復雜 - 請所有的地址,並返回true,如果其中任何一個hav e trade_user設置:

is_trade_user = user.get_profile().address_set.filter(trade_user=True).count() > 0 
+0

user.get_profile()返回基本帳戶,該帳戶包含行標識和用戶標識,然後將其用作帳戶表中的外鍵,其中地址具有在地址表中設置的鍵。不知道如何開始寫這個查詢,我只能從BaseAccount表中獲取user_id。 user.get_profile()。user_id – Udders 2009-12-02 09:40:12

相關問題