在django中实现"团队"的模型

WeG*_*eGi 3 python django django-models

我想在django 1.8中实现一个团队功能.(团队在体育队)

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

我从这个核心开始,但现在我不确定如何建立Team < - > User的连接

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')
Run Code Online (Sandbox Code Playgroud)

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

谢谢,

Wegi

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

Anz*_*zel 8

对于这个用例,我仍然会建议使用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(model.Model):
    user = models.ForeignKey(User)
    team = models.ForeignKey(Team)
    other_fields = #...

    objects = PlayerManager()
Run Code Online (Sandbox Code Playgroud)

用法:

Player.objects.add_player(user, team, *other_fields)
Run Code Online (Sandbox Code Playgroud)

然后,您将能够获得用户相关团队,例如:

team_with_user = Team.objects.filter(players__name="hello")
user_in_team = User.objects.filter(team__name="world")
Run Code Online (Sandbox Code Playgroud)

注意:我没有测试过代码,如果我上面有任何错误,请纠正我.

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