![](/img/trans.png)
[英]How to filter and access ManyToMany fields in a Django QuerySet?
[英]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.