如何查询Django中的多对多字段

时间:2017-10-30 22:40:15

标签: django django-models

我有这些课程 -

class DocumentType(models.Model):
    type_id = models.AutoField(primary_key=True)
    name = models.CharField('type name', max_length=200)

class MetaData(models.Model):
    metadata_id = models.AutoField(primary_key = True)
    name = models.CharField('metadata name', max_length=200, unique=True)
    description = models.TextField('description')

class DocumentTypeMetaData(models.Model):
    documentType_id = models.ManyToManyField(DocumentType,)
    metadata_id = models.ManyToManyField(MetaData,)
    required = models.BooleanField(default=False)

例如,DocumentType值为“Photo”的所需元数据为“Decade”和“Orientation”。

在DocumentTypeMetaData类中,我希望有一个def __str__(self)函数,它在管理页面中返回如下内容 -

Photo: (Decade, Photo Type) required

格式并不重要,我只想知道哪些元数据是必需的。目前,所有显示的都是

DocumentTypeMetaData object

在管理页面上。

我正在努力解决如何编写此函数的查询。

谢谢!

标记

1 个答案:

答案 0 :(得分:0)

这些关系不对。多对多关系是DocumentType和MetaData之间的关系; DocumentTypeMetaData是直通表。所以:

class DocumentType(models.Model):
    type_id = models.AutoField(primary_key=True)
    name = models.CharField('type name', max_length=200)
    metadata = models.ManyToManyField('MetaData', through='DocumentTypeMetaData')

class MetaData(models.Model):
    metadata_id = models.AutoField(primary_key = True)
    name = models.CharField('metadata name', max_length=200, unique=True)
    description = models.TextField('description')

class DocumentTypeMetaData(models.Model):
    document_type = models.ForeignKey(DocumentType)
    metadata = models.ForeignKey(MetaData)
    required = models.BooleanField(default=False)

    def __str__(self):
        return '{} {} {}'.format(self.document_type, self.metadata, self.required)