如何将 ManyToManyField 的选择数量限制为特定数量的选择
How to limit number of choices of a ManyToManyField to a specific number of choices
我正在尝试构建一个多项选择测验 Django 应用程序。我有一个名为 Answer
的模型和另一个名为 Question
.
的模型
以下是Answer
的内容:
class Answer(models.Model):
text = models.CharField(max_length=255)
这是Question
:
class Question(models.Model):
text = models.CharField(max_length=255)
correct_answer = models.ForeignKey('Answer', on_delete=models.CASCADE, related_name='correct_answers')
other_answers = models.ManyToManyField('Answer')
我想将 django-admin
中 other_answers
的选项数量限制为 3 个答案。怎么做?
备注:
- 我可以重新建模我的模型。
- 我不会使用
django-forms
,我只是在为移动应用构建 API。
如果您想将其限制为 3 个具体答案,我想您可以使用 limit_choices_to
如果你只想将它限制为最多 3,那么你应该使用 django model validation
感谢 Geoff Walmsley 的回答,启发了我的正确答案。
这是解决方案:
admin.py:
from django.contrib import admin
from django.core.exceptions import ValidationError
from .models import Question
from django import forms
class QuestionForm(forms.ModelForm):
model = Question
def clean(self):
cleaned_data = super().clean()
if cleaned_data.get('other_answers').count() != 3:
raise ValidationError('You have to choose exactly 3 answers for the field Other Answers!')
@admin.register(Question)
class QuestionAdmin(admin.ModelAdmin):
form = QuestionForm
我正在尝试构建一个多项选择测验 Django 应用程序。我有一个名为 Answer
的模型和另一个名为 Question
.
以下是Answer
的内容:
class Answer(models.Model):
text = models.CharField(max_length=255)
这是Question
:
class Question(models.Model):
text = models.CharField(max_length=255)
correct_answer = models.ForeignKey('Answer', on_delete=models.CASCADE, related_name='correct_answers')
other_answers = models.ManyToManyField('Answer')
我想将 django-admin
中 other_answers
的选项数量限制为 3 个答案。怎么做?
备注:
- 我可以重新建模我的模型。
- 我不会使用
django-forms
,我只是在为移动应用构建 API。
如果您想将其限制为 3 个具体答案,我想您可以使用 limit_choices_to
如果你只想将它限制为最多 3,那么你应该使用 django model validation
感谢 Geoff Walmsley 的回答,启发了我的正确答案。
这是解决方案:
admin.py:
from django.contrib import admin
from django.core.exceptions import ValidationError
from .models import Question
from django import forms
class QuestionForm(forms.ModelForm):
model = Question
def clean(self):
cleaned_data = super().clean()
if cleaned_data.get('other_answers').count() != 3:
raise ValidationError('You have to choose exactly 3 answers for the field Other Answers!')
@admin.register(Question)
class QuestionAdmin(admin.ModelAdmin):
form = QuestionForm