2017-06-06 146 views
2

我有以下模型,通过外键和ManyToMany关系链接。Django - 如何过滤ManyToMany模型对象?

from django.db import models 
from django.contrib.auth.models import User 


class AssetMetadata(models.Model): 

    id = models.DecimalField(6).auto_creation_counter 
    material_id = models.CharField(max_length=256, blank=True) 
    series_title = models.CharField(max_length=256, blank=True) 
    season_title = models.CharField(max_length=256, blank=True) 
    season_number = models.IntegerField(default=0) 
    episode_title = models.CharField(max_length=256, blank=True) 
    episode_number = models.IntegerField(default=0) 
    synopsis = models.TextField(max_length=1024, blank=True) 
    ratings = models.CharField(max_length=256, blank=True) 

    def __str__(self): 
     return self.material_id 

class Batch(models.Model): 
    material_id = models.ManyToManyField(AssetMetadata) 
    user = models.ForeignKey(User, unique=True) 

    def __str__(self): 
     return 'Batch_' + str(self.pk) + '_' + self.user.username 

我可以看到,这工作,模型已经创建和关系工作,如你所期望的。从控制台输出中可以看到:

>>> from asset_db.models import Batch 
>>> Batch.objects.values() 
<QuerySet [{'user_id': 1, 'id': 1}, {'user_id': 3, 'id': 2}]> 

当我迁移模型时,它创建了下列表格(添加了以便您可以看到关系)。

asset_db_batch:

id | user_id 
____________ 
1 | 1 
2 | 3 

asset_db_batch_material_id:

id | batch_id | assetmetadata_id 
______|_____________|________________ 
1  |  1  |  1 
2  |  1  |  2 
3  |  1  |  6 
4  |  1  |  8 
5  |  1  |  4 
6  |  2  |  8 
7  |  2  |  2 
8  |  2  |  4 
9  |  2  |  7 

我的问题是我怎么筛选Batch对象返回关联到batch_id的项目?基本上,我如何在Django重新创建SQL查询:

SELECT * FROM asset_db_batch_material_id 
    INNER JOIN asset_db_batch 
    ON asset_db_batch_material_id.batch_id = asset_db_batch.id 
    INNER JOIN asset_db_assetmetadata 
    ON asset_db_batch_material_id.assetmetadata_id = asset_db_assetmetadata.id 
WHERE user_id = 1 

回答

1

类似于你如何与ForeignKey的

AssetMetadata.objects.filter(batch__user__id=1) 
+0

由于这样做完美。它理解我遇到的过滤器语法,你能推荐任何有用的资源来解释这是更详细的吗? – Lewis909

+0

想不起任何事情。我的规则是“当有疑问总是尝试'__'” – e4c5

+0

我相信你已经看到了这个,https://docs.djangoproject.com/en/1.11/topics/db/queries/#lookups-that-span-relationships是的,这是可以忘记的。 – e4c5