【问题标题】:Diango model property to return list of objects of other modelDjango模型属性返回其他模型的对象列表
【发布时间】:2019-07-28 20:27:40
【问题描述】:

我有 2 个这样的模型:

class Company(models.Model):
    name = models.CharField(max_length=200)
    address = models.CharField(max_length=200)

    class Meta:
        verbose_name = 'Company'

还有另一个模型:

class Product(models.Model):
    name = models.CharField(max_length=200)
    company = models.ForeignKey(to=Company, on_delete=models.PROTECT)

    class Meta:
        verbose_name = 'Product'

现在,我需要在 Company 模型中创建一个属性,它可以返回所有产品对象的列表,例如

@property
def products (self):
    products = []

    for i in Product.objects().filter(company=self.id):
        products.append(i)

    return products

当我在 CompanySerializer 字段中提及产品(属性)时,它给我一个错误,即它无法返回对象列表。

谁能解决我的问题并告诉我代码有什么问题?

【问题讨论】:

    标签: django django-models django-serializer


    【解决方案1】:

    我认为如果您想要 API 中的结果列表,您应该使用 model_to_dict 函数。喜欢,

    @property
    def products(self):
        from django.forms.models import model_to_dict
    
        res = []
        for i in Product.objects.filter(company=self.id):
            res.append(model_to_dict(i))
    
        return res
    

    然后,您可以在您的公司序列化程序类字段中包含此“产品”属性。希望,这会有所帮助!

    【讨论】:

      【解决方案2】:

      Django 动态地向模型添加属性,这些属性返回一个包含所有相关对象的查询集。默认情况下,该属性名为<model name lowercase>_set

      company.product_set.all()
      

      可以通过将related_name 传递给ForeignKey 来更改此属性的名称

      class Product(models.Model):
          company = models.ForeignKey(to=Company, on_delete=models.PROTECT, related_name='products')
      
      company.products.all()
      

      【讨论】:

      • 如何在 CompanySerializer 中返回此结果。我试过了,但它没有显示该字段。 class Company(models.Model): @property def products(self): p = Product.objects.get(pk=self.id) return p.product.all()product是Product模型中product字段的相关字段名。
      猜你喜欢
      • 1970-01-01
      • 2015-04-23
      • 1970-01-01
      • 1970-01-01
      • 2014-08-01
      • 2016-01-10
      • 1970-01-01
      • 1970-01-01
      • 2018-06-21
      相关资源
      最近更新 更多