Django-Manytomy模型关系

2024-05-28 20:21:26 发布

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

我正在为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..}  
                  ]>  

我的问题是:

  1. 模型是否适合其用途?如果不适合,我如何改进它
  2. 我不知道如何获得所有尚未发送新闻稿(上面n3)的订户

我希望我已经清楚地提出了我的问题,我期待着你的建议


Tags: name模型selfidmodelsetc新闻稿subscriber

热门问题