gpt4 book ai didi

Django:模型通过中间模型有两个多对多关系

转载 作者:行者123 更新时间:2023-12-04 01:09:19 24 4
gpt4 key购买 nike

所以我是 Django 的新手,想描述一下场景:有一堆 Persons ,还有一堆Items , 一个人经过 Items到另一个 Person .

我有以下模型:

class Item(models.Model):
title = models.CharField(max_length=1024, blank=False)

def __unicode__(self):
return self.title

class Person(models.Model):
name = models.CharField(max_length=127, blank=False)
out_item = models.ManyToManyField(
Item,
through='Event',
through_fields=('from_user', 'item'),
related_name='giver'
)
in_item = models.ManyToManyField(
Item,
through='Event',
through_fields=('to_user', 'item'),
related_name='receiver'
)

def __unicode__(self):
return self.name

class Event(models.Model):
item = models.ForeignKey(Item)
from_user = models.ForeignKey(Person, related_name='event_as_giver')
to_user = models.ForeignKey(Person, related_name='event_as_receiver')

但是 makemigrations告诉我 app.Person: (models.E003) The model has two many-to-many relations through the intermediate model 'app.Event'.
我想知道我做错了什么?或者什么是实现场景的干净方法?也许我可以分开 Event进入 GiveEventReceiveEvent ?但这在直觉上意义不大,因为传递 item 时实际上只有一个事件。

最佳答案

你所描述的听起来很合理。不允许这样做可能有技术原因;一个语义原因是每个 ManyToManyField意味着创建一个新表,并且不能有两个同名的表(即由同一个类表示)。

一种替代方法(更短和更干燥)是这样的:

class Person(models.Model): 
name = models.CharField(max_length=127, blank=False)
to_users = models.ManyToManyField(
'self',
symmetrical=False,
related_name='from_users',
through='Event',
through_fields=('from_user', 'to_user'),
)

class Event(models.Model):
item = models.ForeignKey(Item, related_name='events')
from_user = models.ForeignKey(Person, related_name='events_as_giver')
to_user = models.ForeignKey(Person, related_name='events_as_receiver')

表结构相同,但描述符不同。访问相关人员更容易一些,但访问相关项目有点困难(例如,您会说 person.out_items.all() 而不是 Item.objects.filter(events__from_user=person).distinct())。

关于Django:模型通过中间模型有两个多对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26436362/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com