具有多对多字段而不是外键的 Django 中间体 table?
Django intermediate table with a many-to-many field instead foreign key?
我的应用程序中有 2 个模型:
- 用户
- 塔楼
我的目标是使用中间件将许多塔与用户相关联table,因为我需要添加一段时间。
所以我的模型中有这样的东西:
class Tower(models.Model):
name = models.CharField(max_length=128)
class User(models.Model):
name = models.CharField(max_length=128)
members = models.ManyToManyField('Tower', through='Dates')
class Dates(models.Model):
user = models.ForeignKey('User', on_delete=models.CASCADE)
tower = models.ForeignKey('Tower', on_delete=models.CASCADE)
begin_date = models.DateTimeField()
end_date = models.DateTimeField()
但我的目标是让 class 中的场塔像这样的多对多日期:
tower = models.ManyToManyField('Tower', blank=True)
这样我就可以在一定时期内将许多塔关联到一个用户。但不幸的是,django 说我需要对 Tower 和 User 使用 forgeignkey classes.
有什么解决办法吗?直接应用中间的多对多字段table?或者我必须创建一个新的 class,有点像 GroupTower,它有一个多对多字段到 Tower class?像这样:
class Tower(models.Model):
name = models.CharField(max_length=128)
class GroupTower(models.Model):
tower = models.ManyToManyField('Tower', blank=True)
class User(models.Model):
name = models.CharField(max_length=128)
members = models.ManyToManyField('Tower', through='Dates')
class Dates(models.Model):
user = models.ForeignKey('User', on_delete=models.CASCADE)
tower = models.ForeignKey('GroupTower', on_delete=models.CASCADE)
begin_date = models.DateTimeField()
end_date = models.DateTimeField()
提前致谢。
设计数据库的方法有很多种。
一个例子:
class Tower(models.Model):
name = models.CharField(max_length=128)
class User(models.Model):
name = models.CharField(max_length=128)
members = models.ManyToManyField('UserTower')
class UserTower(models.Model):
user = models.ForeignKey('User', on_delete=models.CASCADE)
tower = models.ManyToManyField('Tower')
begin_date = models.DateTimeField()
end_date = models.DateTimeField()
在此设计中,您可以向用户添加许多 UserTower
个实例,每个 UserTower
个实例可以有多个塔。
现在,如果您查询用户的成员:
User.objects.get(pk=1).members.all()
如果您以这种方式保存成员,您将拥有按时间段分组的成员,但这需要您编写一些代码以避免 begin_date
、begin_date
和 user
重复。
现在如果你需要塔:
user_members = User.objects.get(pk=1).members.all().values_list('tower', flat=True)
towers = Tower.objects.filter(pk__in=user_members).distinct()
只有当您真的不想要具有相同 begin_date
和 begin_date
的副本时,此设计才可以,我找不到理由。
如果您添加多个具有相同 begin_date
、begin_date
和 user
但不同 tower
.
的实例,您仍然可以拥有所有功能
我的应用程序中有 2 个模型:
- 用户
- 塔楼
我的目标是使用中间件将许多塔与用户相关联table,因为我需要添加一段时间。
所以我的模型中有这样的东西:
class Tower(models.Model):
name = models.CharField(max_length=128)
class User(models.Model):
name = models.CharField(max_length=128)
members = models.ManyToManyField('Tower', through='Dates')
class Dates(models.Model):
user = models.ForeignKey('User', on_delete=models.CASCADE)
tower = models.ForeignKey('Tower', on_delete=models.CASCADE)
begin_date = models.DateTimeField()
end_date = models.DateTimeField()
但我的目标是让 class 中的场塔像这样的多对多日期:
tower = models.ManyToManyField('Tower', blank=True)
这样我就可以在一定时期内将许多塔关联到一个用户。但不幸的是,django 说我需要对 Tower 和 User 使用 forgeignkey classes.
有什么解决办法吗?直接应用中间的多对多字段table?或者我必须创建一个新的 class,有点像 GroupTower,它有一个多对多字段到 Tower class?像这样:
class Tower(models.Model):
name = models.CharField(max_length=128)
class GroupTower(models.Model):
tower = models.ManyToManyField('Tower', blank=True)
class User(models.Model):
name = models.CharField(max_length=128)
members = models.ManyToManyField('Tower', through='Dates')
class Dates(models.Model):
user = models.ForeignKey('User', on_delete=models.CASCADE)
tower = models.ForeignKey('GroupTower', on_delete=models.CASCADE)
begin_date = models.DateTimeField()
end_date = models.DateTimeField()
提前致谢。
设计数据库的方法有很多种。
一个例子:
class Tower(models.Model):
name = models.CharField(max_length=128)
class User(models.Model):
name = models.CharField(max_length=128)
members = models.ManyToManyField('UserTower')
class UserTower(models.Model):
user = models.ForeignKey('User', on_delete=models.CASCADE)
tower = models.ManyToManyField('Tower')
begin_date = models.DateTimeField()
end_date = models.DateTimeField()
在此设计中,您可以向用户添加许多 UserTower
个实例,每个 UserTower
个实例可以有多个塔。
现在,如果您查询用户的成员:
User.objects.get(pk=1).members.all()
如果您以这种方式保存成员,您将拥有按时间段分组的成员,但这需要您编写一些代码以避免 begin_date
、begin_date
和 user
重复。
现在如果你需要塔:
user_members = User.objects.get(pk=1).members.all().values_list('tower', flat=True)
towers = Tower.objects.filter(pk__in=user_members).distinct()
只有当您真的不想要具有相同 begin_date
和 begin_date
的副本时,此设计才可以,我找不到理由。
如果您添加多个具有相同 begin_date
、begin_date
和 user
但不同 tower
.