6

以下の問題を解決しようとしていましたが、検索した結果、Djangoの未解決のバグのようです。モデルの子に classmethod を追加することで問題を解決しましたが、この解決策は機能しますが、この子クラスを使用する (Model)Form には別のカスタム チェックが必要です。他の人が私よりも早く解決策を見つけるためにこれを投稿しています。他の解決策も大歓迎です。

class Foo(models.Model):
    attr1 = models.IntegerField()
    attr2 = models.IntegerField()

    class Meta:
        unique_together = (
            ('attr1', 'attr2'),
        )


class Bar(Foo):
    attr3 = models.IntegerField()

    class Meta:
        unique_together = (
            ('attr1', 'attr3'),
        )

レイズ:

Unhandled exception in thread started by <bound method Command.inner_run of <django.contrib.staticfiles.management.commands.runserver.Command object at 0x10f85a0d0>>
Traceback (most recent call last):
  File "/Users/intelliadmin/VirtualEnvs/virtenv9/lib/python2.7/site-packages/django/core/management/commands/runserver.py", line 91, in inner_run
    self.validate(display_num_errors=True)
  File "/Users/intelliadmin/VirtualEnvs/virtenv9/lib/python2.7/site-packages/django/core/management/base.py", line 270, in validate
    raise CommandError("One or more models did not validate:\n%s" % error_text)
django.core.management.base.CommandError: One or more models did not validate:
app.Bar: "unique_together" refers to attr1. This is not in the same model as the unique_together statement.
4

1 に答える 1

5

考えられる解決策:

class Bar:
    # fields...

    @classmethod
    def _validate_unique(cls, self):
        try:
            obj = cls._default_manager.get(attr1=self.attr1, attr3=self.attr3)
            if not obj == self:
                raise IntegrityError('Duplicate')
        except cls.DoesNotExist:
            pass

    def clean(self):
        self._validate_unique(self)
        super(Bar, self).clean()
于 2013-03-01T15:01:50.410 に答える