ManytoManyField没有返回str对象

时间:2015-07-07 08:59:23

标签: python django

我有以下两种型号。

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)

1 个答案:

答案 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())

根据您的需要更改allfilter的{​​{1}}。

修改

根据评论,您希望您的get模型一次让每个实例与1个客户和1个广告系列相关。在这种情况下,请为Customer_Coupons使用ForeingKey字段而不是ManyToManyField。 您将能够以与在问题中尝试相同的方式访问相关对象字段(即self.Customer_Det.CustomerID)。

如果您需要同时使用优惠券:

  • 用户可以拥有多张优惠券;
  • 优惠券可以属于多个用户。

然后不要指望Customer_Coupons的实例只与1个客户相关。广告系列也是如此。