我有一个读书俱乐部的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)
答案 0 :(得分: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)
答案 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
列,您还可以灵活地更改总裁。