简体   繁体   English

需要基于更多模型构建Django查询集

[英]Need to build a Django queryset based on more models

So what I say might seem complicated, but I think the answer is easy. 所以我说的话似乎很复杂,但我认为答案很简单。 I just can't figure it out. 我只是想不通。 I have a form for a Lecture model, which a logged in teacher can use to post a lecture for his specific courses only. 我有一个演讲模型的表格,登录的老师只能使用该表格发布其特定课程的演讲。 Thing is that in my database I have a TeacherData model which contains a teacher_ID field used for verification, so a teacher cannot create his account on the other Teacher model, if teacher_ID entered doesn't match. 事实是,在我的数据库中,我有一个TeacherData模型,其中包含用于验证的Teacher_ID字段,因此,如果输入的Teacher_ID不匹配,则老师无法在其他Teacher模型上创建其帐户。 But when a course is created in database, the teacher used is the one from TeacherData. 但是,当在数据库中创建一门课程时,所使用的教师就是TeacherData中的一门课程。 So to create my query I have to filter the courses based on TeacherData and then using teacher_ID, to link to Teacher model. 因此,要创建查询,我必须根据TeacherData过滤课程,然后使用Teacher_ID链接到Teacher模型。 I just don't know how to build this queryset but I replicated the wanted behaviour in the template: 我只是不知道如何构建此查询集,但我在模板中复制了所需的行为:

{% if user.is_authenticated and user.is_teacher %}
                <ul>
                    {% for data in teacher_data %}
                        {% if data.teacher_ID == user.teacher.teacher_ID %}
                            {% for course in courses %}
                                {% if course.teacher1 == data or course.teacher2 == data %}
                                     <li>
                                        <a href="{% url 'courses:courses' slug=course.slug %}">{{ course.name }}</a>
                                    </li>
                                {% endif %}
                            {% endfor %}
                        {% endif %}
                    {% endfor %}
                </ul>
{% endif %}




class Teacher(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True)
    name = models.CharField(max_length=30, null=True, blank=True, default=None)
    surname = models.CharField(max_length=50, null=True, blank=True, default=None)
    email = models.EmailField(unique=True, null=True, blank=True, default=None)
    teacher_ID = models.CharField(unique=True, max_length=14,
                                  validators=[RegexValidator(regex='^.{14}$',
                                                             message='The ID needs to be 14 characters long.')],
                                  null=True, blank=True, default=None)


class TeacherData(models.Model):
    name = models.CharField(max_length=30)
    surname = models.CharField(max_length=50)
    teacher_ID = models.CharField(unique=True, max_length=14)
    notes = models.CharField(max_length=255, default=None, blank=True)


class Lecture(models.Model):
    LECTURE_CHOICES = (
        ('Courses', 'Courses'),
        ('Seminars', 'Seminars'),
    )
    course = models.ForeignKey('Course', on_delete=models.CASCADE, default='', related_name='lectures', )
    lecture_category = models.CharField(max_length=10, choices=LECTURE_CHOICES, default='Courses', )
    lecture_title = models.CharField(max_length=100, blank=True, null=True)
    content = models.TextField(blank=False, default=None)

class Course(models.Model):
    study_programme = models.ForeignKey('StudyProgramme', on_delete=models.CASCADE, default='')
    name = models.CharField(max_length=50, unique=True)
    ects = models.PositiveSmallIntegerField(validators=[MaxValueValidator(99)])
    description = models.TextField()
    year = models.PositiveSmallIntegerField(validators=[MaxValueValidator(99)])
    semester = models.IntegerField(choices=((1, "1"),
                                            (2, "2"),
                                            ), default=None)
    teacher1 = models.ForeignKey('TeacherData', on_delete=models.CASCADE, default=None,
                                 verbose_name="Course Teacher", related_name='%(class)s_course_teacher')
    teacher2 = models.ForeignKey('TeacherData', on_delete=models.CASCADE, default=None, null=True,
                                 verbose_name="Seminar Teacher", related_name='%(class)s_seminar_teacher')




class LectureForm(forms.ModelForm):
    lecture_title = forms.CharField(max_length=100, required=True)
    course = forms.ModelChoiceField(initial=Course.objects.first(), queryset=Course.objects.filter(
        Q(teacher1__id__in=[t.id for t in TeacherData.objects.filter(
            teacher_ID__iexact=[t.teacher_ID for t in Teacher.objects.all()])])))

    class Meta:
        model = Lecture
        fields = ('course', 'lecture_category', 'lecture_title', 'content')

try this, 尝试这个,

from django.contrib.auth.decorators import permission_required
from .models import Teacher


@permission_required(  # permission class to check 'is_authenticated' and 'is_teacher')
def my_view(request):
    queryset = Teacher.objects.filter(teacher_ID=request.user.teacher_ID)
    if queryset:
    # do something with teacher data ('queryset' holds those data)
    else:
        return HttpResponse("teacher id not found")

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM