如果您想了解Django与其他字段的ManyToMany关系和django字段类型的知识,那么本篇文章将是您的不二之选。我们将深入剖析Django与其他字段的ManyToMany关系的各个方面,并为您
如果您想了解Django与其他字段的ManyToMany关系和django字段类型的知识,那么本篇文章将是您的不二之选。我们将深入剖析Django与其他字段的ManyToMany关系的各个方面,并为您解答django字段类型的疑在这篇文章中,我们将为您介绍Django与其他字段的ManyToMany关系的相关知识,同时也会详细的解释django字段类型的运用方法,并给出实际的案例分析,希望能帮助到您!
本文目录一览:- Django与其他字段的ManyToMany关系(django字段类型)
- @ManyToMany关系无法保存
- django - 向 manytomany 添加对象:无法添加“
- Django - 如何通过用户先前选择的选项在表单中填充 manytomany 字段
- django admin 显示多对多字段 ManyToManyField
Django与其他字段的ManyToMany关系(django字段类型)
我想在其中自动创建的ManyToMany联接表中存储一些其他信息。我将如何在Django中做到这一点?
就我而言,我有两个表:“雇员”和“项目”。我要存储的是每个项目中每个员工每小时工作所获得的收入,因为这些价值并不相同。那么,我该怎么做呢?
我想到的是,不是使用方法“ ManyToManyField”,而是显式创建了一个第三类/表来存储这些新信息,并使用“ ForeignKey”方法设置其与“ Employees”和“ Projects”的关系。我很确定它会起作用,但这是最好的方法吗?
答案1
小编典典万一链接中断:
from django.db import modelsclass Person(models.Model): name = models.CharField(max_length=128) def __str__(self): # __unicode__ on Python 2 return self.nameclass Group(models.Model): name = models.CharField(max_length=128) members = models.ManyToManyField(Person, through=''Membership'') def __str__(self): # __unicode__ on Python 2 return self.nameclass Membership(models.Model): person = models.ForeignKey(Person) group = models.ForeignKey(Group) date_joined = models.DateField() invite_reason = models.CharField(max_length=64)
@ManyToMany关系无法保存
我有一些与@ManyToMany
关系有关的实体:
@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)@JoinTable(name = "buses_drivers", joinColumns = @JoinColumn (name = "driver_id_inner", referencedColumnName = "driver_id"), inverseJoinColumns = @JoinColumn (name = "bus_id_inner", referencedColumnName = "bus_id"))private List<Bus> buses;
和
@ManyToMany(mappedBy = "buses", fetch = FetchType.EAGER, cascade = CascadeType.ALL)private List<Driver> drivers;
Driver
使用某些Bus
模型执行保存模型时,一切正常。表buses_drivers
存储这些实体的所有键。但是,Bus
使用驱动程序保存模型时,表不会更改。我认为inverseJoinColmns
映射存在问题。
答案1
小编典典那是预期的行为。在双向多对多关联中,一侧必须是反侧。在您的情况下,这是Bus
一面,因为它包含mappedBy
:
拥有关系的字段。除非关系是单向的,否则为必需。
这意味着Driver
是关联的所有者,并且Hibernate仅在维护关联时检查该侧。
django - 向 manytomany 添加对象:无法添加“
如何解决django - 向 manytomany 添加对象:无法添加“<object>”:字段“其他对象”的值为无?
我正在使用表单来检索 TextField。然后我解析文本字段的每一行以创建学生并保存一个 Student
对象。最后,我将学生添加到 Classroom
对象。当学生是课堂的外键时,这很有效。我将此关系更改为多对多关系,现在出现错误:Cannot add "<Student: name>": the value for field "student" is None
。
模型
class Student(models.Model):
user = models.OnetoOneField(CustomUser,on_delete=models.CASCADE,primary_key=True)
student_first = models.CharField(max_length=30)
student_last = models.CharField(max_length=30)
nickname = models.CharField(max_length=31)
fullname = models.CharField(max_length=60)
attend = models.BooleanField(default=True)
do_not_pick = models.BooleanField(default=False)
student_number = models.IntegerField()
email = models.EmailField(max_length=50)
class Classroom(models.Model):
"""The gradebook is split into courses,classes and students"""
classroom_name = models.CharField(max_length=10)
course = models.ForeignKey(Course,on_delete=models.CASCADE)
students = models.ManyToManyField(Student)
user = models.ForeignKey(CustomUser,on_delete=models.CASCADE)
查看
def addmultistudent(request,classroom_id):
"""Add multiple students at once."""
classblock = get_object_or_404(Classroom,pk=classroom_id)
context = {''classblock'': classblock}
if request.method == ''POST'':
form = StudentInputForm(request.POST)
if form.is_valid():
s = form.save()
input_list = []
input_list = s.name_list.split(''\n'')
# the for returns a list of students with student number,fisrt_name,last_name in each line
for line in input_list:
# remove the carriage return
line = line.strip(''\r'')
# removes double quotes
line = line.translate({ord(c): None for c in ''"''})
# ignore the first line which is a header starting with "Pupil"
if not line.startswith("Pupil"):
# get rid of the commas from the csv file
all_names = line.split(",")
# pop the studnet number
sn = all_names.pop(0)
# make sure the student not already been added
if not Student.objects.filter(student_number=sn).exists():
first = all_names.pop(0)
last = ""
for name in all_names:
last = last + name + " "
last = last[:-1]
# create the object and then add the attributes
email_add = sn + "@bc.ca"
nick = first + last[0]
full = first + " " + last
new_student = Student(student_last=last,student_first=first,student_number=sn,nickname=nick,fullname=full,email=email_add)
print(new_student)
print(classblock)
new_student.save()
classblock.students.add(new_student)
# attach student to a user
if not User.objects.filter(username=sn):
user = User.objects.create_user(sn,email_add)
user.last_name = last
user.first_name = first
user.save()
# if the student has been added,we just need to add them to the new classroom
else:
new_student = Student.objects.get(student_number=sn)
classblock.students.add(new_student)
form = StudentInputForm(None)
context[''form''] = form
return render(request,"gradebook/addmultistudent.html",context)
else:
context[''form''] = form
return render(request,context)
print(new_student)
和 print(classblock)
在终端中打印预期的对象,稍后当我转到管理页面时,我可以看到它们存在。如果我然后进入 django shell,我可以输入命令:
c1 = Classroom.objects.all().first()
s1 = Student.objects.all().first()
c1.students.add(s1)
学生 s1 确实被添加到教室中。 FWIW 到目前为止,我只用一个学生和课堂对象对此进行了测试,因此 s1 和 c1 对应于我的错误中提到的对象。
这是不是时间错误,我无法在保存对象后立即将其添加到 m2m 关系中?
解决方法
保存学生前需要先保存用户
android {
defaultConfig {
applicationId ""
}
}
有一个 Student
OneToOne 字段。如果我先保存用户对象,user
将起作用。
new_student.save()
Django - 如何通过用户先前选择的选项在表单中填充 manytomany 字段
如何解决Django - 如何通过用户先前选择的选项在表单中填充 manytomany 字段?
如何使用以前用户选择的子项填充 manytomany 表单字段。
在此代码表单中,呈现带有空复选框的选项。 我希望复选框显示用户订阅了哪些订阅。
models.py
>class Subscription(models.Model):
SUBSCRIPTION_TYPES = (
(''SUB1'',_(''sub 1'')),(''SUB2'',_(''sub 2'')),)
subscription_type = models.CharField(choices=SUBSCRIPTION_TYPES,max_length=30,unique=True)
description = models.CharField(max_length=255,blank=True)
class UserSubscription(models.Model):
user = models.OnetoOneField(User,on_delete=models.CASCADE)
subscriptions = models.ManyToManyField(Subscription,related_name=''subscriptions'',related_query_name=''subscriptions'')
forms.py
>class SubscriptionForm(forms.ModelForm):
class Meta:
model = UserSubscription
fields = (''subscriptions'',)
widgets = {
''subscriptions'': forms.CheckBoxSelectMultiple(),}
views.py
>class SubscriptionFormView(FormView):
template_name = ''profile/subscription.html''
form_class = SubscriptionForm
解决方法
请不要不要创建UserSubscription
,现在您定义了两个连接表。这将导致重复数据,并使查询效率降低,逻辑更容易出错。
您需要的是从 ManyToManyField
到 Subscription
的 User
,因此:
class Subscription(models.Model):
# …
subscribers = models.ManyToManyField(
settings.AUTH_USER_MODEL,related_name=''subscriptions''
)
然后我们可以定义一个表单来选择Subscription
:
from django import forms
class SubscribingForm(forms.Form):
subscriptions = forms.ModelMultipleChoiceField(
queryset=Subscription.objects.all(),widget=forms.CheckboxSelectMultiple()
)
然后在视图中我们就可以处理表单,让登录用户订阅所有已经选择的订阅:
from django.contrib.auth.mixins import LoginRequiredMixin
from django.shortcuts import redirect
class SubscriptionFormView(LoginRequiredMixin,FormView):
template_name = ''profile/subscription.html''
form_class = SubscribingForm
def get_initial(self):
initial = super().get_initial()
initial[''subscriptions''] = self.request.user.subscriptions.all()
return initial
def form_valid(self,form):
subs = form.cleaned_data[''subscriptions'']
self.request.suer.subscriptions.add(*subs)
return redirect(''name-of-some-view'')
注意:您可以将视图限制为基于类的视图,仅允许使用
LoginRequiredMixin
mixin [Django-doc]。
注意:如果 POST 请求成功,您应该发出 redirect
[Django-doc]
实现Post/Redirect/Get pattern [wiki]。
这样可以避免您在用户刷新时发出相同的 POST 请求
浏览器。
django admin 显示多对多字段 ManyToManyField

参考文档 https://jingyan.baidu.com/article/4e5b3e190f55c591901e24b3.html
admin.py

from .models import *
class BookAdmin(admin.ModelAdmin):
list_display = ["title","作者"]
def 作者(self, obj):
return [bt.name for bt in obj.authors.all()]
filter_horizontal = (''authors'',)
admin.site.register(Book,BookAdmin)

models.py

class Book(models.Model):
title = models.CharField(max_length=32)
authors = models.ManyToManyField("Author")
def __str__(self):
return self.title
class Author(models.Model):
name = models.CharField(max_length=32)
def __str__(self):
return self.name

我们今天的关于Django与其他字段的ManyToMany关系和django字段类型的分享就到这里,谢谢您的阅读,如果想了解更多关于@ManyToMany关系无法保存、django - 向 manytomany 添加对象:无法添加“的相关信息,可以在本站进行搜索。
本文标签: