【问题标题】:Django manytomany restrictionDjango 多线程限制
【发布时间】:2014-01-25 16:22:12
【问题描述】:

我是数据库和 Django 的新手。我对触发器知之甚少。

我创建了一个关于学术专家系统的数据库,这里所有的论文最多应该有 4 个主题。如果选择的主题多于应有的“主题过多”警告。一个主题可以由许多论文拥有。所以这是一种多对四的关系。但我不知道如何将上限限制为 4。

我的课是这样的:

class Topic(models.Model):
    name = models.CharField(max_length=200)
    title = models.CharField(max_length=200)

class Paper(models.Model):
    expert = models.ForeignKey(Expert)
    topic = models.ManyToManyField('Topic', related_name='topic+', blank=True)
    coauthors = models.ManyToManyField('Expert', related_name='coauthors+', blank=True)
    title = models.CharField(max_length=200)
    citations = models.ManyToManyField('Paper', related_name='citations+', blank=True)

    def __str__(self):
        return self.title

【问题讨论】:

    标签: django django-models django-orm


    【解决方案1】:

    我认为您应该在表单提交期间检查数据。尝试将此重载的 clean 方法放入表单中,然后将表单放入 Paper 模型的 ModelAdmin 定义中。

    # admin.py
    from django.contrib import admin
    from django import forms
    from django.core.exceptions import ValidationError
    from .models import Paper
    
    class PaperForm(forms.ModelForm):
        class Meta:
            model = Paper
        def clean(self):
            topic = self.cleaned_data.get('topic')
            if topic.count() > 4:
                raise ValidationError("To many topics!")
            return self.cleaned_data
    
    class PaperAdmin(admin.ModelAdmin):
        form = PaperForm
    
    admin.register(Paper, PaperAdmin)
    

    这也不是定义related_name 的最佳方式。 related_name 应该可以帮助您从关系中引用模型。这样做:

    # in your model
    topics = models.ManyToManyField('Topic', related_name='papers', blank=True)
    
    # shell
    paper = Paper.objects.order_by('?')[0] # get random object
    paper.topics.all() # and access it's topics
    topic = Topic.objects.order_by('?')[0] # now get random topic
    topic.papers.all() # and get it's papers using related_name!
    

    topic.topic+.all() 好,对吧?我什至不确定它是否会起作用。

    【讨论】:

    • 成功了,你是对的,在提交期间检查数据是解决方案。谢谢!
    【解决方案2】:

    我认为你应该在你的模型上使用 clean() 方法,而不是在你的表单上。

    首先,因为这与您的模型有关,而不是与您的表单有关,因为如果将来您有其他表单,它应该进行相同的控制,从而重复您自己。

    您可以确定 model.clean() 方法作为Django docs 中的表单验证的一部分执行

    遵循最佳实践也是很好的(除非您知道得更好),类似 MVC 的框架的最佳实践之一是拥有fat models

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多