要求ForeignKey对象是另一个模型的相关对象

时间:2015-08-27 17:45:56

标签: python django django-models

我有一个模特

class EventArticle(models.Model):
    event = models.ForeignKey(Event, related_name='article_event_commentary')
    author = models.ForeignKey(Person)

和另一个模特

class Event(models.Model):
    attendies = models.ManyToManyField(Person, related_name="people")

如何将author限制为仅attendies的对象?

2 个答案:

答案 0 :(得分:1)

通常情况下,ForeignKey limit_choices_to参数是您在这种情况下的朋友。 (见https://docs.djangoproject.com/en/1.8/ref/models/fields/#django.db.models.ForeignKey.limit_choices_to

您可以将作者限制为已参加 任何 事件的用户列表。然而,即使这样做也远非理想:

# don't try this at home, this will be excruciatingly slow...
def author_options():
    all_attendee_ids = []
    for e in Event.objects.all():
        for a in e.attendies.all():
            all_attendee_ids.append(a.id)
    return {'author': Person.objects.filter(id_in=set(all_attendee_ids)).id}

# requires Django 1.7+
class EventArticle(models.Model):
    event = models.ForeignKey(Event, related_name='article_event_commentary')
    author = models.ForeignKey(Person, limit_choices_to=author_options)

但是,即使您未在问题中明确说明,我怀疑您希望作者仅限于该特定事件的一组与会者,即EventArticle模型的事件字段中指定的相同事件。 / p>

在这种情况下,这会带来两个我认为无法彻底解决的问题:

  1. 使用limit_choices_to和
  2. 时,无法传递参数(即事件ID)
  3. 直到EventArticle模型具有事件值,您将不知道哪个事件有问题。
  4. 由于使用limit_choices_to在这里不起作用,可能没有办法彻底解决这个问题。您可以在EventArticle模型中添加一个方法,它会为您提供一个潜在作者的列表,如此...

    class EventArticle(models.Model):
        event = models.ForeignKey(Event, related_name='article_event_commentary')
        author = models.ForeignKey(Person)
    
        def author_options(self):
            if self.event:
                return self.event.attendies.all()
            else:
                return []
    

    ...但是你仍然需要做一些工作来让UI可以使用这些选项,以便用户可以选择它们。如果不了解您的设置,我会猜测我是否试图回答这一部分。

答案 1 :(得分:0)

您可以覆盖EventArticle模型的save()以确保它。