Django模型 - 列表与一对多

时间:2017-10-12 03:13:08

标签: python django database database-design django-models

我想要关联的两个模型AudienceReports。受众模型具有一组引用特定受众实例的ID,而报告具有与特定受众实例相关的单独代码集。最重要的是,每个报告都与多个受众群体相关联。

对于Django来说,这仍然是一个新手,但是在设置数据库模型时,我感到非常生气。

在我目前的解决方案中,我创建了第三个模型AudienceReportMapping,它只是将audience_idreport_code联系起来。我在Reports上有一个类方法,它使用中间映射表为我提供与每个报告相关的代码的适当受众标识。相关的一切都是这样设置的:

from django.db import models
from django_mysql import ListTestField

class Audience(models.Model):
    ...
    id = models.IntegerField()


class AudienceReportMapping(models.Model):
    audience = models.ForeignKey(Audience)
    report_code = models.IntegerField()


class Reports(models.Model):
    ...
    report_id = models.IntegerField()
    codes = ListTextField(
        base_field=models.IntegerField()
    )

    @classmethod
    def audience_ids(cls, report_id):
        report = Reports.objects.filter(report_id=report_id).first()
        codes = report.codes
        audience_ids = []
        for code in codes:
            audience = AudienceReportMapping.objects.filter(report_code=code).first().audience
            audiences_ids.append(audience.id)
        return audience_ids

对于以前解决过的问题,这感觉就像是一个非常不优雅的解决方案,只是难以理解模型设置。有没有更好的方法可以做到这一点?

更具体地说,我觉得我应该能够直接在模型定义中建立关系,而不是使用类方法来确定正确的id。我认为将id映射到代码的必要性让我感到困惑。

#------- Edit --------#

经过一番思考后,似乎我想在report_code的受众群体模型上设置一个新属性,因为这是一对一的,然后在报告模型上有audiences = models.ForeignKey(Audience)将受众与报告进行一对多的映射。并完全取消了AudienceReportMapping。

0 个答案:

没有答案