gpt4 book ai didi

Django 多对多限制

转载 作者:行者123 更新时间:2023-12-04 02:32:24 32 4
gpt4 key购买 nike

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

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

我的类(class)是这样的:

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

最佳答案

我认为您应该在提交表单时检查数据。尝试将这个重载的 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() 好吧?我什至不确定它是否有效。

关于Django 多对多限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21353038/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com