我有以下两种型号。
class Customer(models.Model):
Customer = models.OneToOneField(User)
CustomerID = models.CharField(max_length = 15)
def __str__(self):
return self.Customer.username
class Customer_Coupons(models.Model):
Customer_Det = models.ManyToManyField(Customer)
Campaign_Det = models.ManyToManyField(Campaigns)
Redeemed = models.BooleanField(default = False)
def Get_Customer_ID(self):
return '\n'.join([p.CustomerID for p in self.Customer_Det.all()])
def Get_Campaign_ID(self):
return '\n'.join([p.CampaignID for p in self.Campaign_Det.all()])
def __str__(self):
return self.Customer_Det.CustomerID
我遇到了Customer_wallet的 str 方法的问题。查询时,我似乎得到以下错误。有没有更好的方法来定义 str 方法?我最好想要一个CustomerID或Customer name,它再次存储在User表中。
TypeError: __str__ returned non-string (type ManyRelatedManager)
答案 0 :(得分:0)
您的Customer_Coupons.Customer_Det
字段为ManyToManyField
,因此self.Customer_Det
不表示单个值。
您可能希望迭代Customer.CustomerID
中的所有可能self.Customer_Det
来构建返回字符串。或者只使用你遇到的第一个,或者任何适合你需要的东西。
尝试:
return ' / '.join(cust.CustomerID for cust in self.Customer_Det.all())
根据您的需要更改all
或filter
的{{1}}。
根据评论,您希望您的get
模型一次让每个实例与1个客户和1个广告系列相关。在这种情况下,请为Customer_Coupons
使用ForeingKey
字段而不是ManyToManyField
。
您将能够以与在问题中尝试相同的方式访问相关对象字段(即self.Customer_Det.CustomerID
)。
如果您需要同时使用优惠券:
然后不要指望Customer_Coupons
的实例只与1个客户相关。广告系列也是如此。