我必须穿着Models.py做模特

class Teams(models.Model):
    Name = models.CharField(verbose_name="Team Name", max_length=200)
    Slug = AutoSlugField(populate_from="Name",  always_update=True, editable=True, verbose_name="Team Slug")
    Location = models.CharField(verbose_name="Team Location", max_length=200)
    Leader = models.ForeignKey('Members', on_delete=models.SET_NULL, null=True, blank=True)
    ArrivalDate = models.DateTimeField(default=timezone.now, editable=False, verbose_name="Arrival Date")
    DepartureDate = models.DateTimeField(null=True, blank=True, verbose_name="Departure Date")

class Members(models.Model):
    Name = models.CharField(verbose_name="Member Name", max_length=200)
    Team = models.ForeignKey(Teams, on_delete=models.CASCADE)
    PhoneNumber = models.CharField(max_length=20,  null=True, blank=True)
    Email = models.EmailField(max_length=50, null=True, blank=True)
    BloodType = models.CharField(max_length=3, choices=BLOOD_TYPE_CHOICES, null=True, blank=True)
    isLeader = models.BooleanField(default=False)

当Members字段中的isLeader字段设置为True时,我希望更新团队模型中的Leader字段.

提前谢谢你

推荐答案

最好的方法是根本不存储领导者,因为那是重复的数据.您可以通过以下方式确定领导者.否则,您将存储重复的数据,正如您自己实际已经发现的那样,保持表的同步被证明是一个比人们预期的要困难得多的问题:

class Team(models.Model):
    name = models.CharField(verbose_name='Team Name', max_length=200)
    slug = AutoSlugField(
        populate_from='Name',
        always_update=True,
        editable=True,
        verbose_name='Team Slug',
    )
    location = models.CharField(verbose_name='Team Location', max_length=200)
    arrival_date = models.DateTimeField(
        default=timezone.now, editable=False, verbose_name='Arrival Date'
    )
    departure_date = models.DateTimeField(
        null=True, blank=True, verbose_name='Departure Date'
    )

    @property
    def leader(self):
        return Member.objects.filter(team=self, is_leader=True).first()

Member模型中,我们可以添加一个约束,即最多有一个这样的领导者:

from django.db.models import Q


class Member(models.Model):
    name = models.CharField(verbose_name='Member Name', max_length=200)
    team = models.ForeignKey(Teams, on_delete=models.CASCADE)
    phone_number = models.CharField(max_length=20, null=True, blank=True)
    email = models.EmailField(max_length=50, null=True, blank=True)
    blood_type = models.CharField(
        max_length=3, choices=BLOOD_TYPE_CHOICES, null=True, blank=True
    )
    is_leader = models.BooleanField(default=False)

    class Meta:
        constraints = [
            models.UniqueConstraint(
                fields=('team',),
                condition=Q(is_leader=True),
                name='one_leader_per_team'
            ),
        ]

Note:通常情况下,当相关字段发生更改时,您应该更改not个slug.正如在文章Cool URIs don't change [w3.org]中所写的,URI not应该改变,因为它们可以被书签标记.因此,应该仅在创建对象时创建辅助信息,而不是在更改辅助信息所依赖的任何字段时创建辅助信息.


通常情况下,Django 模特的名字是singular,所以是Member,而不是Members.


Note:Django模型中的字段名称通常写在snake_case中,而不是PascalCase中,所以应该是:blood_type而不是Bloodtype.

Python-3.x相关问答推荐

使用PANAS根据另两个列表中的值对一个列表中的字符串值进行分组

无法使用Python slack 螺栓SDK读取在 slack 通道中收到的消息

Django将任何查询显示为html表格

以某种方式分割字符串

为什么 get_form 方法中小部件的更改没有反映 Django 管理站点中的更改

如何获取实例化 `types.GenericAlias` 的下标类?

DataFrame列中如何迭代重复值?

Python (pandas) - 判断一个 df 中的值是否在另一个(不相等)df 中的任何对之间

Sunburst 折线图可视化

这种类型提示有什么作用?

协议不支持地址系列在将 Scapy L3socket 与 WSL 一起使用时

如何在python中将列表转换为其他格式

为什么 f-strings 比 str() 更快地解析值?

具有函数值的 Python 3 枚举

Pytorch 的随机 Select ?

带百分号的 Python 字符串格式

计数大于Pandas groupby 中的值的项目

向 Python 函数添加属性的最佳方法

带有 Emacs 的 Python 3

注册 Celery 基于类的任务