我正在为Django编写一个时事通讯应用程序。 该应用程序处理订户注册、新闻稿呈现和发送。 对于多对多关系和“直通”模型,我对数据库缺乏了解,这让我感到困扰
My models.py有一个订户模型、一个新闻稿模型和一个绑定它们的“直通”模型。“通过”中还有一个“电子邮件读取”和“日期读取”字段,在订户第一次打开电子邮件并允许使用图像时,该字段将被更新(我不保证知道)
一个订户可以有多个新闻稿,一个新闻稿可以有多个订户
以下是my models.py的缩写:
class Subscriber(models.Model):
first_name = models.CharField(max_length=30)
#etc..
newsletters = models.ManyToManyField('Newsletter', through='NewsletterEngagement')
def __str__(self):
return '%s %s %s %s %s %s' % \
(self.pk,
self.first_name,
#etc..,
)
class Newsletter(models.Model):
title = models.CharField(max_length=200)
#etc..
subscribers = models.ManyToManyField('Subscriber', through='NewsletterEngagement')
def __str__(self):
return '%s %s %s %s' % \
(self.pk,
#etc..,
)
class NewsletterEngagement(models.Model):
subscriber = models.ForeignKey(Subscriber, on_delete=models.CASCADE)
newsletter = models.ForeignKey(Newsletter, on_delete=models.CASCADE)
read = models.BooleanField(default=False)
read_date = models.DateField(null=True)
def __str__(self):
return '%s %s %s %s' % \
(self.subscriber,
self.newsletter,
self.read,
self.read_date,
)
该模型似乎运行良好,如下所示:
>>> s1 = Subscriber.objects.get(pk=1)
>>> s2 = Subscriber.objects.get(pk=2)
>>> n1 = Newsletter.objects.get(pk=1)
>>> n2 = Newsletter.objects.get(pk=2)
>>> n3 = Newsletter.objects.get(pk=3)
>>> NewsletterEngagement(subscriber=s1, newsletter=n1).save()
>>> NewsletterEngagement(subscriber=s2, newsletter=n1).save()
>>> NewsletterEngagement(subscriber=s2, newsletter=n2).save()
以下查询按预期工作:
>>> n1.subscribers.values()
>>> <QuerySet [{'id': 1, 'first_name': 'XXXXXXS1', #etc.. }
{'id': 2, 'first_name':'XXXXXXS2', #etc..}
]>
>>> n2.subscribers.values()
>>> <QuerySet [{'id': 2, 'first_name': 'XXXXXXS2', #etc.. }
]>
>>> s1.newsletters.values()
>>> <QuerySet [{'id': 1, 'title': 'Newsletter One', #etc..}]>
>>> s2.newsletter.values()
>>> <QuerySet [{'id': 1, 'title': 'Newsletter One', #etc..},
{'id': 2, 'title': 'Newsletter Two', #etc..}
]>
我的问题是:
我希望我已经清楚地提出了我的问题,我期待着你的建议
目前没有回答
相关问题 更多 >
编程相关推荐