Django:如何使用多对多关系过滤数据

时间:2020-01-09 15:35:00

标签: django django-models django-orm

假设我有这样的模型:

models.py

class Category(models.Model):
    name = models.CharField(max_length=70, verbose_name='Name')
    order_num = models.IntegerField(verbose_name='Order Number')

class Advertisement_Type(models.Model):
    name = models.CharField(max_length=70, verbose_name='Name')
    ad_category = models.ManyToManyField(Category, verbose_name='Ad Category')

class Advertisement(models.Model):
    title = models.CharField(max_length=70, verbose_name='Title')    
    ad_type = models.ForeignKey(Advertisement_Type, on_delete=models.CASCADE, verbose_name='Advertisement Type')

如何仅使用过滤器以这种格式按类别和广告类型检索广告?这可能吗?因为我能想到的唯一方法是查询所有内容,然后通过许多我想避免的for循环和if-else手动构建字典/ JSON。

期望的格式/输出

advertisement_type: {
    name: 'Type 1',
    category: {'Health', 'Engineering'},
    advertisement: {ads1, ads2, ads3}, # Can these be objects?
},
advertisement_type: {
    name: 'Type 2',
    category: {'Math', 'Numbers'},
    advertisement: {ads4, ads5, ads6}, # Can these be objects?
}

谢谢!

1 个答案:

答案 0 :(得分:0)

要获取模型的相关对象,可以使用prefetch_related,该work具有 ManyToMany 关系。

在示例getAnswers(event) { if (event.target.checked) { console.log('checked: ' + event.target.id); } else { console.log('unchecked: ' + event.target.id); } } ads_typesad_category中是QuerySet,因此它们返回对象列表并且也可以被过滤。

advertisement_set

或者您可以检查Django Rest Framework serializers for related objects以获得json对象表示以及相关性。

您还可以通过添加related_name选项来改进ManyToMany字段。