【问题标题】:Queryset from a ManyToMany relation来自多对多关系的查询集
【发布时间】:2011-06-23 15:51:00
【问题描述】:

我正在 Django 中创建一个小日历应用程序。我有两个模型类;日历和事件。一个事件可以在多个日历中。因此,我使用的是多对多关系。

这是我的模特

from django.db import models

class Calendar(models.Model):
    title = models.CharField(max_length = 255)

    def __unicode__(self):
        return self.title

class Event(models.Model):
    title = models.CharField(max_length = 255)
    start_date = models.DateField()
    end_date = models.DateField(blank = True, null = True)
    location = models.CharField(blank = True, max_length = 255)
    description = models.TextField(blank = True)
    important = models.BooleanField(default = False)
    calendar = models.ManyToManyField(Calendar)

如何获取包含特定日历中所有事件的查询集?

【问题讨论】:

    标签: python django django-models many-to-many


    【解决方案1】:

    您可以在日历记录的实例上使用 .event_set 属性。像这样:

    # create two calendars
    one = models.Calendar.objects.create(title='calendar one')
    two = models.Calendar.objects.create(title='calendar two')
    
    # attach event 1 to both calendars
    event = models.Event.objects.create(title='event 1', start_date='2011-11-11')
    one.event_set.add(event)
    two.event_set.add(event)
    
    # attach event 2 to calendar 2
    two.event_set.add(models.Event.objects.create(title='event 2', start_date='2011-11-11'))
    
    # get and print all events from calendar one
    events_one = models.Calendar.objects.get(title='calendar one').event_set.all()
    print [ event.title for event in events_one ] 
    # will print: [u'event 1']
    
    # get and print all events from calendar two
    events_two = models.Calendar.objects.get(title='calendar two').event_set.all()
    print [ event.title for event in events_two ] 
    # will print: [u'event 1', u'event 2']
    

    models.Calendar.objects.get(title='two').event_set.all()

    【讨论】:

      【解决方案2】:

      Django 自动提供了一种访问多对多关系中相关对象的方法:

      events = my_calendar.events.all()
      

      请参阅many-to-many relationships 上的文档。

      如果您还没有日历实例,而只有一个 ID 或名称,您可以在一个查询中完成所有操作:

      events = Event.objects.filter(calendar__id=my_id)
      

      【讨论】:

      • 除非您在ManyToManyField 上指定related_name='events',否则它不应该是my_calendar.event_set.all()吗?
      【解决方案3】:

      mycalendar = Calendar.objects.get(id=1)

      事件 = mycalendar.event_set.all()

      取自并修改自:http://docs.djangoproject.com/en/dev/topics/db/queries/#many-to-many-relationships

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-01-04
        • 2015-12-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-03
        • 2018-11-02
        相关资源
        最近更新 更多