【问题标题】:how to use __str__ with foreign key '__str__ returned non-string (type Product)'如何将 __str__ 与外键“__str__ 返回非字符串(产品类型)”一起使用
【发布时间】:2020-01-07 15:19:00
【问题描述】:

当我尝试时

__str__()

外国的方法它提供了这个错误

__str__ returned non-string (type Product)

models.py

class Product(models.Model):
    product_name = models.CharField(unique=True, max_length=50 , 
    blank=False,null=False)
    price = models.PositiveIntegerField()
    active = models.BooleanField(default=True)
    def __str__(self):
        return self.product_name
class ProductOrder(models.Model):


    product = models.ForeignKey(Product, on_delete=models.CASCADE , 
    null=True)
    ordering = models.ForeignKey(Order, 
    on_delete=models.CASCADE,blank=True,null=True)
    pass 


    def __str__(self):
        return self.product

我也试过了

def __str__(self):
        return self.product.product_name 

#product_name is a field from Product table 

将提供的错误是

__str__ returned non-string (type QuerySet)

如何表示,谢谢回复!

【问题讨论】:

  • 你能分享你的Product 模型吗?
  • 试试str(self.product)str(self.product.product_name)
  • @namo:你能返回确切的回溯吗?您确定错误不在 另一个 __str__ 方法中吗?
  • 请出示您的Order 型号和__str__ 方法
  • @namo:乍一看,似乎有另一个模型有一个不返回字符串的__str__,可能是Order,因为那是你的另一个ForeignKey ProductOrder.

标签: python django model


【解决方案1】:

您不能从__str__ 方法返回除string 以外的其他内容。 self.product 不是 string,而是 Product 对象。

但是,您可以通过它调用str(..),以获取该Product 的文本表示:

class ProductOrder(models.Model):
    product = models.ForeignKey(Product, on_delete=models.CASCADE, null=True)
    ordering = models.ForeignKey(Order, on_delete=models.CASCADE,blank=True,null=True)

    def __str__(self):
        return str(self.product)

【讨论】:

  • 我也试过了,但是不行(str返回非字符串(类型QuerySet))
  • 然后发生了一些非常奇怪的事情。你确定你写的是self.product(不是product)。你能分享你的Product 模型吗,也许某些东西的定义方式会以某种方式返回QuerySet
  • 如何在模板中显示外键而不是其 id
  • @namo:通常如果您使用{{ some_object.foreign_key }},它将获取相关对象,因此使用所引用对象的__str__。但是,如果您当然指定了一个__str__,它会返回作为主键的str(self.pk)。我建议您使用相关模板、模型和视图提出一个新问题。
【解决方案2】:

因为models.ForeignKey(Product, on_delete=models.CASCADE , null=True) 没有返回str,所以为该函数返回一个字符串或尝试这样做

return str(self.product)

【讨论】:

    【解决方案3】:

    试试

    def __str__(self):
        return str(self.product)
    

    您可能还需要在 Product 模型上定义 __str__ 方法

    【讨论】:

    • 那我猜你的产品型号设置不正确。也许您在文件中的某个地方定义了一个 Product 变量,它以某种方式覆盖您的模型定义?它不应该是一个查询集。您的 Product 模型的 str 方法是什么?
    • 我更新了代码,也分享了产品模型,
    【解决方案4】:

    ForeignKey 返回连接到 Key 的整个链接基础。您需要从 ProductOrder 中返回 CharFeiled 或从其他类中像 self.product.product_name 一样搅拌。

    【讨论】:

      猜你喜欢
      • 2020-09-15
      • 2018-03-02
      • 1970-01-01
      • 2020-04-19
      • 2018-08-16
      • 2018-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多