2015-10-16 106 views
1

我有一个图书俱乐部的Django模型,其中包含一个总统和许多成员。当然,俱乐部主席也会自动成为会员。我如何配置我的会员字段以便总是添加总裁,并有扩展空间?这是我目前俱乐部模式:在我的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) 

回答

-1

要验证该president始终处于members,如果没有,向总统加入会员。你可以通过验证模型对象来做到这一点。请参阅docs

-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列。

+0

对字段类型使用IntegerField。那么整数是否应该指明总裁是特定用户的ID? – Elliot

+0

正如我在字段声明之前的评论中提到的那样,成员为'0',总裁为'1'。这对总统来说意味着这个值将被设置为'1'。您可以使用布尔列以及字段名称,如'is_president'。 – anuragal

+0

Gotcha。最后一个问题,member_type不是会员模式下的字段,而不是Club?因为每个成员都需要成员类型,请更正? – Elliot

1

您不能自动配置“会员”字段。

我建议您使用ManyToMany关系与through选项,因此您可以在会员(用户)和俱乐部之间的关系中添加额外的字段。例如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)