2012-01-15 12 views
2

私はニュースレターシステムを開発しています。このシステムには、多対多の関係を持つニュースレターカテゴリと報道関係者(サブスクリプションを話す)があります。 これら二つのモデルを考えてみましょう:複数のカテゴリから複数のオブジェクトを取得する(多対多関連)もっとジャンゴワイの方法

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項目のリスト(それは正直なところにはクエリーセットです)を保存しています。

ありがとうございました!あなただけにニュースレターを送信する電子メールが必要な場合は

答えて

1

、あなたはこのようにそれを行うことができます。一度だけのデータベースを叩きながら

qs = NewsletterAbo.objects.filter(categories_set__is_active=True) 
qs = qs.values_list('email', flat=True).distinct() 

は、これは、あなた独自の電子メールアドレスのフラットなリストを提供します。 distinct()values()/values_list()の詳細については、djangoのドキュメントをご覧ください。

関連する問題