我有一个模特
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
的对象?
答案 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>
在这种情况下,这会带来两个我认为无法彻底解决的问题:
由于使用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()以确保它。