Форма Django после сохранения нескольких записей, которые нарушают уникальную проверку целостности - PullRequest
0 голосов
/ 04 июля 2011

У меня есть модель для хранения результатов футбольного матча за квартал:

class BoxScoreByQuarter( models.Model ):
    game_participant = models.ForeignKey( GameParticipant, verbose_name='game participant' )
    first_quarter = models.PositiveSmallIntegerField( blank=True, null=True, verbose_name='first quarter' )
    second_quarter = models.PositiveSmallIntegerField( blank=True, null=True, verbose_name='second quarter' )
    third_quarter = models.PositiveSmallIntegerField( blank=True, null=True, verbose_name='third quarter' )
    fourth_quarter = models.PositiveSmallIntegerField( blank=True, null=True, verbose_name='fourth quarter' )
    overtime = models.PositiveSmallIntegerField( blank=True, null=True, verbose_name='overtime' )
    final_score = models.PositiveSmallIntegerField( blank=True, null=True, verbose_name='final score' )

game_participant - это FK для модели GameParticipant, и на участника в игре никогда не должно быть более одного BoxScoreByQuarter.

Мое представление проверяет наличие BoxScoreByQuarter и либо обновляет его, либо создает новое.

        try:
            initial_box = BoxScoreByQuarter.objects.get( game_participant=participant )
            box_score = BoxScoreByQuarterForm( submitted_data, instance=initial_box )
        except ObjectDoesNotExist:
            box_score = BoxScoreByQuarterForm( submitted_data )
            initial_box = None

        if box_score.is_valid():
            game_results = box_score.save()

По некоторым причинам сохранение иногда приводит к двум или даже большему количеству записей BoxScoreByQuarter для данного участника. Это не происходит постоянно, и, похоже, в этом нет никакой закономерности.

Есть ли более надежный способ обработки сохранения формы, который гарантировал бы целостность данных?

1 Ответ

1 голос
/ 04 июля 2011

Если вам нужен только один BoxScoreByQuarter на GameParticipant, вам следует использовать OneToOneField.

...