繁体   English   中英

在我的Django模型中,如何自动填充字段?

[英]In my Django model, how can I automatically populate a field?

我有一个读书俱乐部的Django模型,其中包含一个总裁和很多成员。 当然,俱乐部主席也将自动被视为成员。 如何配置我的成员字段以始终添加具有扩展空间的总裁? 这是我当前的俱乐部模特:

class Club(models.Model):
    president = models.ForeignKey(User, related_name='president')
    name = models.CharField(max_length=30)
    description = models.TextField(max_length=320)
    members = models.ManyToManyField(User, related_name='members')
    creation_date = models.DateTimeField(auto_now_add=True)

您无法自动配置“成员”字段。

我建议您将ManyToMany关系与“ through选项一起使用,这样您就可以为Member(User)和Club之间的关系添加额外的字段。 例如is_president=True (请参阅文档示例ManyToMany.through

# models.py
from django.db import models
from django.contrib.auth import get_user_model

class Club(models.Model):
    name = models.CharField(max_length=30)
    description = models.TextField(max_length=320)
    members = models.ManyToManyField(through="Membership", related_name='clubs')

class Member(models.Model):
    user = models.OneToOne(get_user_model())

class Membership(models.Model):
    member = models.ForeignKey(Member)
    club = models.ForeignKey(Club)
    date_joined = models.DateField()
    is_president = models.BooleanField(default=False)

但是,在当前模型设置中,您可以重载不推荐的Model.save() ,或者使用Django的内置后保存信号 (首选)。

1,创建方法(或函数),将检查“主席”是否为俱乐部的“成员”

# models.py
def check_president_as_member(sender, instance, **kwargs):
    #check if instance.president is in instance.members.all()
    #add president to members if necessary
    return True

2,在俱乐部模型上注册后保存方法。

# models.py
from django.db import models 
models.signals.post_save.connect(check_president_as_member, sender=Club, dispatch_uid="check_president_as_member_post_save", weak=False)

您想验证president是否一直在members ,如果不是,则将总裁添加到成员中。 您可以通过验证模型对象来实现。 请参阅文档

一个更好的模型设计将是

class Club(models.Model):
    name = models.CharField(max_length=30)
    description = models.TextField(max_length=320)
    members = models.ManyToManyField(User, related_name='members')
    member_type = models.IntegerField(default=0) #0 member 1 president
    creation_date = models.DateTimeField(auto_now_add=True)

我所做的是删除了总统专栏,因为那是多余的。 总统也将是俱乐部的成员,因此请使用flag member_type标识哪个成员是总统。

这也将使您只需更改member_type列即可灵活地更改总裁。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM