Связь между моделями с композитными ключами - PullRequest
1 голос
/ 08 июля 2011

У меня есть две модели с составными ключами:

class ContestUser(models.Model):
    user_id = models.IntegerField(primary_key = True)
    contest_id = models.IntegerField(primary_key = True)
    username = models.CharField(max_length = 1536, blank = True)
    .
    .
    .



class ContestRegistration(models.Model):
    user_id = models.IntegerField(primary_key = True)
    contest_id = models.IntegerField(primary_key = True)
    status = models.IntegerField(choices = EJUDGE_CONTEST_STATUSES)
    .
    .
    .

Первый вопрос: как их связать и выполнить запрос, как в соединении.

Выбор * в ContestRegistration r присоединение к ContestUser u onr.user_id = u.user_id и r.contest_id = u.contest_id где r.contest_id = 3;

Второе - Как сохранить подобный объект?

cuser = ContestUser.objects.get(user_id = 1, contest_id = 1)
cuser.username = 'username'
cuser.save()

Это приводит кIntegrityError: (1062, «Дублирующаяся запись« 1-1 »для ключа« PRIMARY »»)

Выполненный SQL:

SELECT * FROM `users` WHERE (`users`.`contest_id` = 1  AND `users`.`user_id` = 1 );
SELECT (1) AS `a` FROM `users` WHERE `users`.`user_id` = 1  LIMIT 1;
UPDATE `users` SET ... WHERE `users`.`user_id` = 1 ;

1 Ответ

0 голосов
/ 08 июля 2011

Модели Django не поддерживают несколько первичных ключей: https://docs.djangoproject.com/en/1.3/faq/models/#do-django-models-support-multiple-column-primary-keys

Однако, как описано в документации, вы можете использовать другие свойства полей ForeignKey, например, unique_together, чтобы сделать то же самое. Надеюсь, это поможет вам.

...