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

时间:2015-10-16 05:10:47

标签: python django model

我有一个读书俱乐部的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)

3 个答案:

答案 0 :(得分:1)

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

我建议使用ManyToManythrough选项的关系,这样您就可以为会员(用户)和俱乐部之间的关系添加额外的字段。例如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(),这是不推荐的,或者在post-save signal中使用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)

答案 1 :(得分:-1)

您要验证president是否始终位于members,如果不是,则要将总裁添加到成员。您可以通过验证模型对象来完成此操作。请参阅docs

答案 2 :(得分:-1)

您的模型的更好设计将是

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)

我所做的是取消了总统专栏,因为它是多余的。总统也将成为俱乐部的成员,因此请使用旗帜member_type来确定哪位成员是总统。

通过更改member_type列,您还可以灵活地更改总裁。