2015-10-16 2 views
1

У меня есть модель Django для книжного клуба, в котором есть один президент и многие члены. Естественно, что президент клуба автоматически будет считаться членом. Как я могу настроить поле своих членов, чтобы всегда добавлять президента, с возможностью расширения? Вот моя текущая модель Club:В моей модели 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 для типа поля. Так должно ли целое число ссылаться на идентификатор конкретного пользователя, который является президентом? – Elliot

+0

Как я упоминал в комментарии перед объявлением поля, что '0' для участника и' 1' для президента. Это означает, что для президента это значение будет установлено на '1'. Вы также можете взять булевский столбец с именем поля, например 'is_president'. – anuragal

+0

Gotcha. Один последний вопрос, не будет ли member_type полем под моделью участника, а не с клубом? Потому что должен быть тип члена для каждого члена, правильно? – Elliot

1

Вы не можете настроить поле «члены» автоматически.

Я бы порекомендовал использовать связь through, так что вы сможете добавить дополнительное поле к отношениям между пользователем (пользователем) и клубом. например is_president=True. (Смотрите пример DOCS 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 который предпочитаемый.

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) 
Смежные вопросы