[英]Require ForeignKey object to be a related object of another model
我有一个模特
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
?
通常,在这种情况下, ForeignKey
limit_choices_to
参数是您的朋友。 (请参阅https://docs.djangoproject.com/zh-CN/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模型的event字段中指定的同一事件)的一组参与者。
在这种情况下,这带来了两个我认为无法彻底解决的问题:
由于在这里无法使用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,以便用户可以选择它们。 在不了解您的设置的情况下,我会猜测是否尝试回答该部分。
您可以重写EventArticle模型的save()来确保它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.