[英]How to populate my Django Model 'updated_by' field with logged in User automatically using a formset?
[英]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.