Первичный ключ автоинкремента модели Django на основе внешнего ключа - PullRequest
10 голосов
/ 21 января 2012

Я пытаюсь выяснить, как расположить две из моих моделей Django, чтобы при сохранении новой модели в базе данных ее первичный ключ увеличивался так, чтобы это было следующее наибольшее значение для всех записей с одинаковыми внешний ключ.

Это очень похоже на этот вопрос задан , но мне интересно, как бы вы сделали это в Django. Вот выдержка из вопроса, который демонстрирует похожую ситуацию:

id | job_id | title
0     1        hi
1     1        hello
2     1        goodbye
0     2        hi
1     2        hello

Я знаю, , вы не можете иметь несколько первичных ключей в модели Django , и вы можете использовать unique_together , но в документации говорится, что он использует эквивалентный оператор UNIQUE в CREATE заявления. Будет

class ModelA(models.Model):
   key = models.PositiveIntegerField(primary_key = True)
   fk = models.ForeignKey(ModelB)

   def Meta(self):
      unique_together = ("key", "fk")

в моделях работают с этим ответом чтобы выполнить то, что я ищу? Отношения между моделями - это одна ModelA, имеющая много ModelB с, но каждая ModelB, имеющая только одну ModelA.

1 Ответ

11 голосов
/ 21 января 2012

Дирк, вы должны внести некоторые изменения в модель (если это допустимо), как сказал Игнасио .Итак, ModelA теперь должно выглядеть примерно так:

class ModelA(models.Model):
    key = models.PositiveIntegerField()
    fk = models.ForeignKey(ModelB)

    def Meta(self):
        unique_together = ("key", "fk")

    def save(self, *args, **kwargs):
        key = cal_key(self.fk)
        self.key = key
        super(ModelA, self).save(*args, **kwargs)

Как вы видите, у меня есть overridden the default save method для вычисления значения ключа из метода cal_key, принимающего fk as argument.Итак, определите следующий метод cal_key ниже в файле моделей.

def cal_key(fk):
    present_keys = ModelA.objects.filter(fk=fk).order_by('-key').values_list('key',flat=True)
    if present_keys:
        return present_keys[0]+1
    else:
        return 0

Метод cal_key четко указывает, что вам действительно нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...