Django如何过滤多个模型对象?

2024-10-01 07:25:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下模型,它们通过外键和多个关系链接。你知道吗

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}]>

当我迁移模型时,它创建了以下表(添加了这些表以便您可以看到这些关系)。你知道吗

资产\数据库\批次:

id | user_id
____________
1  |    1
2  |    3

资产\u数据库\u批次\u物料\u 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 

Tags: selfidtruedbmodelsbatchassetlength