2015-09-20 2 views
0

У меня есть простое приложение Django, где пользователи могут общаться с разными институтами, заключая с ними контракты. Пользователь может работать для каждого института (у него есть контракт), и часы их рабочего времени.Django обновляет две записи одной промежуточной модели

Теперь я хочу, чтобы пользователь определял контракт по умолчанию, который будет выбран, когда ничего не указано (тогда будет назначено рабочее время с тактовой частотой). Это можно сделать с помощью следующей модели:

class Contract(models.Model): 
    user = models.ForeignKey(User, on_delete=models.CASCADE) 
    institute = models.ForeignKey(Institute, on_delete=models.CASCADE) 
    work_hours = models.DecimalField(max_digits=4, decimal_places=1) 
    default = models.BooleanField(default=False) 

    class Meta: 
     # We want each employee to only have one contract per institute. 
     unique_together = ('user', 'institute',) 

Мой вопрос: Как я могу ограничить пользователю только один контракт по умолчанию? Если у меня есть два разных контракта, контракт А является текущим дефолтом, а затем я меняю контракт Б на значение по умолчанию, я хочу, чтобы значение для контракта А стало ложным.

Я не уверен, что это проблема, с которой я должен работать внутри модели или внутри ModelForm. Если вы используете последний, я не уверен, как создать форму со всеми возможными пользовательскими контрактами и выбором радио, который изменяет значение по умолчанию для двух записей (установка значения по умолчанию по умолчанию - False и установка нового значения по умолчанию - Правда). Или я должен изменить его на совершенно другую логику модели?

+0

Я думаю, что лучшим решением является сделать это внутри ModelForm, потому что вы не можете увидеть, как определить в модели это правило. –

ответ

0

Я предпочитаю, чтобы переопределить Model.save() потому, что кунг-фу выполняется только один раз при создании договора по умолчанию

class Contract(models.Model): 
    def save(self, *args, **kwargs): 
     # Check if a default contract already exists 
     if Contract.filter(user=self.user, default=True).exists(): 
      # e.g. you can set the previous default contract to be default=False 
      Contract.filter(user=self.user, default=True).update(default=False) 
      # or you can raise a validation error 
      # raise ValidationError('A default contract already exists') 

     # else, just carry on with the save 
     super(Contract, self).save(*args, **kwargs) 

Я не вижу другого пути, кроме как сделать дополнительную модель в целом как этого

class DefaultContract(models.Model): 
    user = models.ForeignKey(User, unique=True) 
    contract = models.ForeignKey(Contract) 

unique=True сделает проверку базы данных и обеспечение, что там будет, в лучшем случае, будет один DefaultContract для каждого пользователя.

+0

Спасибо! Я решил пойти другим путем и переопределить свои модели, но в противном случае я, вероятно, использовал бы ваше решение! –

Смежные вопросы