私はニュースレターシステムを開発しています。このシステムには、多対多の関係を持つニュースレターカテゴリと報道関係者(サブスクリプションを話す)があります。 これら二つのモデルを考えてみましょう:複数のカテゴリから複数のオブジェクトを取得する(多対多関連)もっとジャンゴワイの方法
class NewsletterCategory(models.Model):
title = models.CharField(max_length=255, unique=True)
slug = models.SlugField(max_length=255, unique=True)
is_active = models.BooleanField(default=True)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
class Meta:
ordering=['title']
def __unicode__(self):
return self.title
class NewsletterAbo(models.Model):
abo_id = models.CharField(max_length=255, unique=True)
first_name = models.CharField(max_length=255, unique=False)
last_name = models.CharField(max_length=255, unique=False)
email = models.EmailField(max_length=75, unique=False)
is_active = models.BooleanField(default=False)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
categories = models.ManyToManyField(NewsletterCategory, blank=True)
class Meta:
ordering=['last_name']
def __unicode__(self):
return (self.last_name + ', ' +self.first_name)
今私は1 emailadress複数回に送信されたbeeingてニュースレターせずに複数のNewsletterCategoriesにニュースレターを送ったいことを想像してください。これは、1つのNewsletterAboが複数のNewsletterCategoriesにある場合に発生します。 は、これまでのところ、私は(重複を避けて)これに似ためにメールを送信したいのABOを収集します。
# get all NewsletterCategories that are active,
categories = NewsletterCategory.objects.filter(is_active=True)
# initialize empty list for storing NewsletterAbos
abolist = []
# loop through retrieved NewsLetterCategories
for cat in categories:
# get NewsletterAbos that are related to a NewsletterCategory
abos = cat.newsletterabo_set.filter(is_active=True)
# add retrieved NewsletterAbos to list
abolist += abos
# removing duplicate entries
abolist = set(abolist)
# ... do something else then like sending out newsletter to abolist subscriptions
Abolistは今、重複のないabolist項目のリストです。 私の質問です:ORMを使用してこれを行うためのより多くの "django-ish"方法がありますか?
何か助けていただければ幸いです。
UPDATE: lazerscienceの答えの助けを借りて、私は自分のニーズに合った次のコードを考え出し:
qs=NewsletterAbo.objects.filter(categories__is_active=True,
categories__id__in=[1,2,3,4],
is_active=True).distinct()
このコード行は、私が必要とするすべてNewsletterAbosを取得します。新しいqsは、私が以前にabolistに保管していたabo項目のリスト(それは正直なところにはクエリーセットです)を保存しています。
ありがとうございました!あなただけにニュースレターを送信する電子メールが必要な場合は