我想要关联的两个模型Audience
和Reports
。受众模型具有一组引用特定受众实例的ID,而报告具有与特定受众实例相关的单独代码集。最重要的是,每个报告都与多个受众群体相关联。
对于Django来说,这仍然是一个新手,但是在设置数据库模型时,我感到非常生气。
在我目前的解决方案中,我创建了第三个模型AudienceReportMapping
,它只是将audience_id
与report_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。