0
class PropertyCategory(models.Model):

    name = models.CharField(max_length=75)

    def __unicode__(self):
        return self.name

    class Meta:
        verbose_name = _('Property Category')
        verbose_name_plural = _('Property Categories')



class Property(models.Model):

    category = models.ForeignKey(PropertyCategory)
    name = models.CharField(max_length=75)

    def __unicode__(self):
        return self.name

    class Meta:
        verbose_name_plural = 'Properties'



class Variant(models.Model):

    properties = models.ManyToManyField(Property)
    code = models.CharField(max_length=255)

    def __unicode__(self):
        product = Product.objects.get(variants__id=self.id)

        return '%s (%s)' % (product.name, ', '.join([c.name for c in self.properties.all()]))

作成/更新時にバリアントを検証するにはどうすればよいです ?PropertyPropertyCategory

私がこの製品を持っているとしましょう。Lace-trim Cheeky Panty (Pink, XS)ここで、括弧内のプロパティはPropertiesfromPropertyCategory ColorSizeです。Variantをそれぞれ 1 つしか持てないように制限したいPropertyCategoryので、このようなことは起こりません。

Lace-trim Cheeky Panty (Pink, XS, Blue, M)

それに加えて、複数持つことが許可されているPropertyCategory場合、に特別な値を設定することを考えています。洗濯指示が複数回発生する可能性があるとしましょう。その違いをどのように捉えますか?

class PropertyCategory(models.Model):

    name = models.CharField(max_length=75)
    multi_instance = models.BooleanField() # This determines if the Category's Properties can be applied more than once on a Variant
    ...

multi_instance..しかし、この機能は、ユーザーが後でfrom TruetoFalseなどを設定することを決定した場合に関係を壊す可能性があるため、おそらくより多くの問題を引き起こします.

たぶん、法線PropertyCategoryを拡張できMultiPropertyCategoryますか?

4

1 に答える 1

1

残念ながら、これはよくある問題です。propertiesの一部のように見えますが、Variantその宣言により、実際には と の両方を主キーManyToManyFieldで参照するまったく新しいテーブルが作成されます。したがって、が作成されると、厳密に言えば、それに関連付けられたものはありません。これは、 がデータベースに存在する場合にのみ発生する可能性があるためです。そのため、メソッドをオーバーライドして検証を行おうとする (一般的な最初のアプローチ) が機能しません。VariantsPropertiesVariant PropertiesVariantModel.save()

同様に、メソッドをオーバーライドすることでカスタム検証Model.clean()を提供できますが、これが (たとえば を介しModelForm.is_valid()て) 呼び出された時点では、オブジェクトとその参照はまだデータベースに追加されていません。

Django のフォーム (管理サイトを含む) を使用している場合は、ModelForm validationを調べてください。基本的に、ModelForm のメソッドをオーバーライドし、フォーム自体clean()ではなくフォームを検証しModelます。

2 番目の質問については、a を追加するというあなたの考えはBooleanField私には良さそうに思えます。ユーザーがその値を不適切に変更することを懸念している場合は、管理サイトでアクセス許可を使用してアクセスを制御できますPropertyCategories(または検証で変更を制限します)。値を からTrueに変更するFalseと問題が発生することは間違いありませんが、これは概念的な問題であり、実装に選択した特定の方法に関係なく当てはまります。

于 2013-08-02T23:02:04.410 に答える