Skip to main content
 首页 » 编程设计

python之在 Django 中以不同模型的形式显示多对多

2025年01月19日27shihaiming

假设我有三个模型,一个是Professor 模型,一个是Course 模型,一个是Review 模型。允许用户进行评论,评论教授特定类(class)的教授。

我在考虑如何对Professor 和Course 的多对多关系建模,以及如何在Review 中引用该关系.到目前为止,我的想法是使用 models.ManyToMany 链接 Professor 和 Course。

Models.py(教授)

class Prof(models.Model): 
first_name = models.CharField(max_length = 20, unique = False) 
last_name = models.CharField(max_length = 20, unique = False) 
 
    def __str__ (self): 
        return self.first_name + " " + self.last_name 
 
class Course(models.Model): 
    name = models.CharField(max_length = 20, unique = True) 
    prof = models.ManyToManyField(Prof) 
 
    def __str__ (self): 
        return self.name 

Models.py(复习)

class Review(models.Model): 
    message = models.TextField(max_length = 4000) 
    created_at = models.DateTimeField(auto_now_add = True) 
    updated_at = models.DateTimeField(null = True) 
    rating = models.IntegerField( 
        default = 5,  
        validators = [MaxValueValidator(5), MinValueValidator(0)] 
    ) 
    prof = models.ForeignKey(Prof, related_name = 'reviews') 
    course = models.ForeignKey(Course, related_name = 'reviews') 
    user = models.ForeignKey(User, related_name = 'reviews') 
 
    def __str__ (self): 
        return self.message    

表单.py

class ReviewForm(ModelForm): 
    rating = CharField(widget=TextInput(attrs={'type': 'number','value': 5, 'min': 0, 'max': 5})) 
 
    class Meta: 
        model = Review 
        fields = ['message', 'rating', 'prof', 'course', 'user'] 

到目前为止,这是我用于显示表单的代码

<h1>New Review</h1> 
<form method="POST"> 
    {% csrf_token %} 
    <p>{{ review_form.message }}</p> 
    <p>{{ review_form.rating }}</p> 
    <p>{{ review_form.prof }}</p> 
    <!-- The prof chosen's courses should be shown here --> 
    <button type="submit">Save</button> 
</form> 

现在,forms.py 显示了Course 下的所有对象,我不确定如何显示教授的类(class)。从下拉列表中选择教授后,是否可以过滤表格,以显示他/她教授的类(class)?

请您参考如下方法:

听起来您的做法是正确的。你还没有提到你的 urls.py 结构,或者 views.py 但最直接的方法是按教授显示类(class),使用教授的 id (或 slug-field)作为参数 - 在 URL 中(v 直截了当)或作为上一页表单的输出(并使用教授参数重新加载模板)或在 Ajax 中,具体取决于您对 shiny 的偏好-新事物。

在您看来,当您调用表单时,您可以按照 this answer 中的行进行操作-

form.courses.queryset = Course.objects.filter(professor__in=[professor.id,])

请注意,我已将过滤条件放在此处的列表中,该列表只有一项 - 它确实为您提供了扩展范围,或稍后使用查询集实现更复杂的功能。

如果您使用基于类的 View ,请适当调整。 :)