簡體   English   中英

要求ForeignKey對象是另一個模型的相關對象

[英]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字段中指定的同一事件)的一組參與者。

在這種情況下,這帶來了兩個我認為無法徹底解決的問題:

  1. 使用limit_choices_to時,您不能傳遞參數(即事件ID),並且
  2. 直到EventArticle模型具有事件值,您才知道哪個事件有問題。

由於在這里無法使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM