【问题标题】:Implementing a model for "teams" in django在 django 中实现“团队”模型
【发布时间】:2015-04-25 16:56:40
【问题描述】:

我想在 django 1.8 中实现一个团队功能。 (团队如运动队)

每个用户一次最多可以加入一个团队,因此一个团队可以容纳多个用户。现在我不确定如何定义我的 models.py

我从这个核心开始,但现在我不确定如何建立团队的连接用户

from django.db import models

class Team(models.Model):
    name = models.CharField(max_length=64, unique=True)
    description = models.TextField(max_length=1024)
    logo = models.ImageField()

from django.contrib.auth.models import User

class Player(models.Model):
    user = models.OneToOneField(User)
    team = ForeignKey('Team')

我现在是创建第二个类 user_team 还是只是将团队作为外键添加给用户? (如果这就是我需要这样做的方式?)

谢谢,

维吉

// 编辑:我在底部添加了一些代码。这个 Player 模型是否足以定义关系?

【问题讨论】:

  • 你想用team_id = model实现什么?
  • 你设置user profile model了吗?
  • 如果您的Player 没有额外字段,我强烈建议您只保留一个Team 模型并将player 作为其中的ManyToMany 字段,引用User.
  • @WeGi,你可以在你的Team 上实现一个TeamManager 并添加任何方法,如add_player() 并将所有逻辑/检查放入其中。
  • WeGi,是的,应该这样做。 @Anzel,确实,但稍后可能需要额外的字段,并且拥有 ForeignKey 可以在数据库级别强制关系的唯一性,这将简化代码并减少出错的可能性。

标签: python django django-models


【解决方案1】:

对于这个用例,我仍然会建议使用 ManyToMany 字段的替代方案,并带有中间模型和模型管理器。

一个简单的示例结构如下所示:

from django.db import models
from django.contrib.auth.models import User


class Team(models.Model):
    name = models.CharField(max_length=64, unique=True)
    description = models.TextField(max_length=1024)
    logo = models.ImageField()
    players = models.ManyToManyField(User, through='Player')


class PlayerManager(models.Manager):
    use_for_related_fields = True

    def add_player(self, user, team):
        # ... your code here ...

    def remove_player(self, user, team):
        # ... your code here ...

    def trasnfer_player(self, user, team):
        # ... your code here ...


class Player(models.Model):
    user = models.ForeignKey(User)
    team = models.ForeignKey(Team)
    other_fields = #...

    objects = PlayerManager()

用法:

Player.objects.add_player(user, team, *other_fields)

然后你就可以得到User相关的Team,例如:

team_with_user = Team.objects.filter(players__name="hello")
user_in_team = User.objects.filter(team__name="world")

注意:我没有测试过代码,所以如果我在上面犯了任何错误,请纠正我。

我喜欢这种方式的原因是将您的数据库逻辑抽象到应用程序中。所以将来如果需要允许User 加入多个团队,您只需更改应用程序逻辑以允许通过管理器即可。

【讨论】:

  • @WeGi,很高兴你喜欢这个。是的,我喜欢以更灵活的方式构建我的应用程序,并尝试使用应用程序层来实现关系。因此,为了避免未来可能出现的迁移地狱,相信我,您的数据库管理员(如果有的话)会喜欢您成为一名开发人员。
【解决方案2】:

正如@aumo 所建议的,我通过添加这样的用户配置文件模型解决了这个问题:

from django.contrib.auth.models import User

class Player(models.Model):
    user = models.OneToOneField(User)
    team = models.ForeignKey('Team')

我选择了这个解决方案,而不是在 Teams 类中将团队添加为 ManyToMany 字段,因为我不确定在开发过程中是否需要向 Player 添加更多字段。

感谢大家的帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    • 2019-08-18
    • 2019-02-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多