限制django中ManyToManyField中的关系数

Raa*_*mar 7 django django-models django-orm

我在我的代码中使用ManyToMany关系,我有一个展厅和他们的类别.现在一个陈列室可以分为最多三个类别,我必须在保存时验证它.以下是我的代码:

##models.py
class Showrooms(models.Model):
    name = models.CharField(max_length = 100)
    contact_person = models.CharField(max_length = 100)
    offer = models.TextField()
    categories = models.ManyToManyField(Categories, null=True, blank=True,    related_name='categories')


    class Meta:
        db_table = 'showrooms'
        verbose_name_plural = "showrooms"


class Categories(models.Model):
    category = models.CharField(max_length = 100)
    image = models.ImageField(upload_to = showroom_upload_path, null=True, blank=True)
    slug = models.SlugField(blank=True)

    class Meta:
        db_table = 'showroom_categories'
        verbose_name_plural = "categories"

    def __str__(self):
        return self.category
Run Code Online (Sandbox Code Playgroud)

一切都工作正常,除了我无法对每个陈列室的类别数量进行验证.我没有在视图中使用它,但只是想在管理员中这样做.

请帮忙

谢谢

编辑

好的..我已经解决了我的问题.我在forms.py中创建了一个表单

class ShowroomsForm(forms.ModelForm):
    class Meta:
        model = Showrooms

    def clean(self):
        categories = self.cleaned_data.get('categories')
        if categories and categories.count() > 3:
            raise ValidationError('Maximum three categories are allowed.')

        return self.cleaned_data
Run Code Online (Sandbox Code Playgroud)

并将其添加到admin.py,如下所示:

class ShowroomsAdmin(admin.ModelAdmin):
    form = ShowroomsForm


admin.site.register(Showrooms, ShowroomsAdmin)
Run Code Online (Sandbox Code Playgroud)

Adr*_*ien 6

您可以在模型上定义 clean() 方法,每当陈列室被分配到超过 3 个类别时,就会引发验证错误。

https://docs.djangoproject.com/en/1.5/ref/models/instances/#django.db.models.Model.clean

  • @RaakeshKumar 继续回答你自己的问题,这是高度鼓励的。这样我们就可以对答案进行投票并将其与其他答案进行比较,并且该问题将被视为由该网站回答。 (3认同)

Raa*_*mar -1

我所需要的只是创建一个模型表单:

class ShowroomsForm(forms.ModelForm):
    class Meta:
        model = Showrooms
    
    def clean(self):
        categories = self.cleaned_data.get('categories')
        if categories and categories.count() > 3:
            raise ValidationError('Maximum three categories are allowed.')
    
        return self.cleaned_data
Run Code Online (Sandbox Code Playgroud)

并将其添加到 admin.py 中,如下所示:

class ShowroomsAdmin(admin.ModelAdmin):
    form = ShowroomsForm
    

admin.site.register(Showrooms, ShowroomsAdmin)
Run Code Online (Sandbox Code Playgroud)