2017-06-28 21 views
0

私はビュー内でpythonによって内部的に使用されるモデルを持っています。フォームは関係ありません。このように見える内部のみ使用されているモデルのモデル検証

class ShareLink(models.Model): 

    from_share = models.ForeignKey(Share, on_delete=models.CASCADE, related_name='from_share') 
    to_share = models.ForeignKey(Share, on_delete=models.CASCADE, related_name='to_share') 

    created_at = models.DateTimeField(auto_now_add=True) 
    updated_at = models.DateTimeField(auto_now=True) 

    creator = models.ForeignKey(settings.AUTH_USER_MODEL) 
    active = models.BooleanField(default=True) 

    mode = models.PositiveSmallIntegerField(choices=SHARE_LINK_MODE_CHOICES, default=1) 

    class Meta: 

     unique_together = ('from_share', 'to_share', 'mode', 'active') 

    def clean(self): 
     ret = super(ShareLink, self).clean() 
     return ret 

私はいくつかの制限があります。たとえば、作成者はfrom_shareなどの作成者でなければなりません。ですから、基本的にはモデルのclean()で何が行われるでしょうか。しかしこれは、ModelFormが関係する場合にのみ呼び出されます。しかし、私はこのモデルが内部でしか使われていないので、私は持っていません。私のモデルを検証する最良の方法は何ですか?何かアドバイス

+0

あなたはPythonコードの場合にShareLinkのインスタンスを作成しようとしています私は正しく理解していますか?または「内部的に」とはどういう意味ですか? – dentemm

+0

ビューでのみ有効 – mbieren

答えて

1

モデルでclean()メソッドを実装した後、あなたが検証を行うために、インスタンスを保存する前に、ビュー内のfull_clean()メソッドを呼び出すことができます(docsを参照してください):だから

sharelink = ShareLink() 
try: 
    sharelink.full_clean() 
except ValidationError as e: 
    # Do something based on the errors contained in e.message_dict. 
    # Display them to a user, or handle them programmatically. 
    pass 
sharelink.save() 
+0

ほとんどの場合、.objects.create(....)を使用して新しいオブジェクトを作成しています。私はクラスShareLink(ValidatorMixin、models.Model)のようなMixinを使うための別の提案を読んでから、このmixinのsaveメソッドを上書きします。しかしコメントは、これが問題を引き起こすかもしれないと示唆した。 objects.create(...)のアプローチは少し議論の余地があるようです。 – mbieren

関連する問題