简体   繁体   English

如何定义外键关系?

[英]How to define the foreign key relationship?

I'm new to django and the database concepts.我是 django 和数据库概念的新手。

I'm getting the 1042 error code when I'm trying to register student via frontend and don't know where my mistake is当我尝试通过前端注册学生时收到 1042 错误代码,但不知道我的错误在哪里

if anyone can help that'd be great.如果有人可以提供帮助,那就太好了。

I tried different ways but none was beneficial.我尝试了不同的方法,但没有一个是有益的。

I can add the student via the admin panel of django but cannot do the same via frontend.我可以通过 django 的管理面板添加学生,但不能通过前端执行相同的操作。

这是此处的屏幕截图。

models.py模型.py

class Session(models.Model):
    session = models.CharField(max_length=150, default=" ")
    def __str__(self):
        return self.session
    
    def get_absolute_url(self):
        return reverse('datapage')
    
    
class Student(models.Model):
    user = models.OneToOneField(User, on_delete = models.CASCADE, primary_key = True)
    phone_number = models.CharField(max_length=20, blank = True)
    semester = models.CharField(max_length=20, blank = True)
    session_year = models.ForeignKey(Session, on_delete = models.CASCADE)
    
    def __str__(self):
        return str(self.user)

forms.py forms.py

session_years = Session.objects.all()
session_year_list = []
for session_year in session_years:
    single_session_year = (session_year.id, session_year.session)
    session_year_list.append(single_session_year)

class StudentSignUpForm(UserCreationForm):
    first_name = forms.CharField(required=True)
    last_name = forms.CharField(required=True)
    email = forms.EmailField(required=True)
    username = forms.CharField(required=True)
    phone_number = forms.CharField(required=True)
    semester = forms.CharField(required=True)
    
    def clean_email(self):
        email = self.cleaned_data.get('email')
        email = email.lower()
        if User.objects.filter(email__iexact=email).exists():
            raise forms.ValidationError('A user has already registered using this email')
        return email
    
    def clean_username(self):
        username = self.cleaned_data.get('username')
        if User.objects.filter(email__iexact=username).exists():
            raise forms.ValidationError('A user has already registered using this username')
        return username
    
    class Meta(UserCreationForm.Meta):
        model = User
        fields = ['first_name', 'last_name', 'email', 'username']
        

    @transaction.atomic
    def save(self):
        user = super().save(commit=False)
        user.is_student = True
        user.first_name = self.cleaned_data.get('first_name')
        user.last_name = self.cleaned_data.get('last_name')
        user.email = self.cleaned_data.get('email')
        user.username = self.cleaned_data.get('username')
        user.save()
        student = Student.objects.create(user=user)
        student.phone_number=self.cleaned_data.get('phone_number')
        student.semester=self.cleaned_data.get('semester')
        student.session_year=self.cleaned_data.get('session_year')
        student.save()
        return user

views.py视图.py

class StudentRegister(LoggedInRedirectMixin, CreateView):
    model = User
    form_class = StudentSignUpForm
    template_name = 'registration/user_register.html'

    def form_valid(self, form_class):
        user = form_class.save()
        return redirect('datapage')

@Vatsai Vohera - Correct me if I am wrong. @Vatsai Vohera - 如果我错了请纠正我。

 session = Session.objects.get(session=self.cleaned_data.get('session_year')
    student.session_year = session

    

You are adding your requested data into session_year field which is not working rather you have to save your requested data to your model Session field session. I hope this will work for you.您正在将请求的数据添加到不起作用的 session_year 字段中,而您必须将请求的数据保存到 model Session 字段 session 中。我希望这对您有用。

You can use related_name='...' field in your ForeignKey attribute and also add this:您可以在 ForeignKey 属性中使用related_name='...'字段并添加以下内容:

session_year = models.ForeignKey(Session,related_name='some thing', on_delete = models.CASCADE, null = True)

then you have to call session_year by related name那么你必须通过相关名称调用 session_year

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

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