لا يمكن لـ Django تعيين القيم على ManyTomanyfield التي تحدد نموذجًا وسيطًا. استخدم المدير بدلاً من ذلك
سؤال
أنا أعمل على توفير نفس الجدولين - مع وجود علاقة M2M. لا أنجح ، فإن خطأي يستمر بشيء مثل: لا يمكن تعيين القيم على ملعب ManyTomany الذي يحدد نموذجًا وسيطًا. استخدم مدير العضوية بدلاً من ذلك حيث تكون العضوية "من خلال الجدول".
رمز بلدي :
def save_classroom(request):
classroom_instance = Classroom()
if request.method == 'POST':
form = ClassroomForm(request.POST, request.FILES, user = request.user)
if form.is_valid():
new_obj = form.save(commit=False)
new_obj.user = request.user
new_obj.save()
membership = Membership(member = request.user,classroom=new_obj)
membership.save()
form.save_m2m()
return HttpResponseRedirect('.')
else:
form = ClassroomForm(user = request.user)
return render_to_response('classroom/classroom_form.html', {
'form': form,
},
context_instance=RequestContext(request))
نماذج بلدي:
class Classroom(models.Model):
user = models.ForeignKey(User, related_name = 'classroom_creator')
classname = models.CharField(max_length=140, unique = True)
date = models.DateTimeField(auto_now=True)
open_class = models.BooleanField(default=True)
members = models.ManyToManyField(User,related_name="list of invited members", through = 'Membership')
class Membership(models.Model):
accept = models.BooleanField(default=False)
date = models.DateTimeField(auto_now = True)
classroom = models.ForeignKey(Classroom, related_name = 'classroom_membership')
member = models.ForeignKey(User, related_name = 'user_membership')
أين أنا مخطئ؟
المحلول
كما شوهد على:
http://docs.djangoproject.com/en/dev/topics/db/models/#intermediary-manytomany
على عكس الحقول العادية للعديد من الأشياء ، لا يمكنك استخدام إضافة أو إنشاء أو مهمة (أي ، Beatles.mebers = [...]) لإنشاء علاقات
أعتقد أن الرمز الخاص بك يتجول على السطر "form.save_m2m ()" ، وهو أمر غير ضروري لأنك بالفعل إنشاء عضوية يدويًا.
نصائح أخرى
إذا سمح لك بالتعديل class Membership
, مضيفا auto_created = True
قد تحل مشكلتك ،
class Membership(models.Model):
class Meta:
auto_created = True
في Django 1.7 ، يتم تغيير رسالة الخطأ إلى "لا يمكن تعيين القيم على ManyTomanyfield التي تحدد نموذجًا وسيطًا". الحل هو نفسه.
ملاحظة: سيؤدي ذلك إلى إزالة النموذج الوسيط بالكامل ، وجميع الحقول الإضافية معه.
كان لدي رسالة خطأ مماثلة في مشكلة مختلفة. أنشرها هنا فقط في حال يساعد الآخرين.
لقد أضفت جديدة ManyToManyField
على نموذج موجود. تم استخدام هذا النموذج في أ ModelForm
بنيت مع exclude
مجال.
لقد أصلحت المشكلة عن طريق إضافة الحقل الجديد في الحقل المستبعد.
اعتبارا من Django 2.2 إصدار يمكنك أيضًا تحديد أ through_defaults
في الحقل من أجل استخدام إضافة وإنشاء وتخصيص:
ال
RelatedManager.add()
,create()
,remove()
,set()
,get_or_create()
، وupdate_or_create()
يُسمح الآن بالأساليب في العلاقات العديدة إلى العدد مع النماذج المتوسطة. الجديدthrough_defaults
يتم استخدام الوسيطة لتحديد قيم مثيل (أماكن) النموذج الوسيط الجديد.
في حالتك نظرًا لأن جميع الحقول لديها بالفعل افتراضات قد تعمل في 2.2.