簡體   English   中英

用於交叉多對多關系字段的 Django 查詢集

[英]Django queryset for intersecting ManyToMany relations fields

我有一個難題,我試圖根據每個 ManyToMany 字段上存在的模型的交集來選擇具有多對多關系的彼此相關的模型。 我試圖用 F() 來實現這一點,但沒有成功,我認為我對 DB/ORM 不夠熟練來解決這個問題。

下面是一個例子:

class Event(models.Model):
    want_private = models.ManyToManyField('User')

class User(AbstractUser):
    events = models.ManyToManyField(Event, related_name='users')

首先,我想從一組用戶中選擇事件,例如那些以“a”開頭的事件:

users_a = User.objects.filter(username_startswith="a")

所以查詢集應該是:

Event.objects.filter(users=users_a)

當它變得復雜時,我想:

  • 排除用戶同時出現在事件的users字段、事件的want_private字段和users_a的事件。
  • 包括用戶同時在事件的users字段中的事件,而不是在事件的want_private字段和users_a

有沒有人有任何想法來解決這個問題?

非常感謝,

卡米爾。

根據您上面的評論,似乎用戶可以與事件相關聯,並且他們的關聯是公開的或私有的(我在這里解釋了want_private含義)。 如果是這種情況,那么我建議您更改數據結構,並將此信息存儲在through 模型中 像這樣的東西:

class Event(models.Model):
    # Remove want_private from here.

class User(AbstractUser):
    events = models.ManyToManyField(Event, related_name='users', through=UserEvent)

class UserEvent(models.Model):
    """ Through model between event and user. Store want_private here."""
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    event = models.ForeignKey(Event, on_delete=models.CASCADE)
    want_private = models.BooleanField()  # This is now a boolean field

我在上面鏈接的文檔中解釋了這是如何工作的。

現在,您的事件查詢變得更加簡單:

Event.objects.filter(users__username__startswith='a', userevent__wants_private=False)

這將為您提供至少一個用戶與該事件相關聯的所有事件,並且他們的關聯不是 private 如果某個事件的用戶同時屬於這兩個類別,則此查詢將包括該事件。

我在這里對want_private的含義做了一些假設。 如果want_private本質上是一個附加標志,用於與用戶與事件的關聯,那么這個直通模型就是正確的數據結構。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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