2017-03-22 3 views
0

Je reçois l'erreur suivante après avoir changé une relation ForeignKey à une relation ManyToMany. La méthode de mise à jour fonctionne-t-elle sur Many to Many?Exception lors de l'échange d'une clé ForeignKey avec ManyToMany Champ

Impossible de mettre à jour le modèle champ (seulement non les relations et les clés étrangères autorisées).

Maintenant, cela se produit dans la section d'administration lors d'une tentative de sauver modelStudent model.This est le modèle dont le champ j'ai changé pour ManytoMany

pièce A:

class modelPatient(models.Model): 
    #student   = models.ForeignKey(modelStudent ,null=True, blank=True) #Mutlipe Patients for single student 
    student   = models.ManyToManyField(modelStudent,null=True,default=None,blank=True) 
    patient_name  = models.CharField(max_length=128, unique=False) 

Maintenant, ce que je avoir dans ma section admin (admin.py). Fondamentalement, le but de ce formulaire est de permettre à l'utilisateur d'assigner plusieurs étudiants à un modelPatient dans l'admin interface.I encore comme ça serait caractéristique

pièce B:

class adminStudentForm(forms.ModelForm): 
    class Meta: 
     model = modelStudent 
     fields = '__all__' 
    patients = forms.ModelMultipleChoiceField(queryset=modelPatient.objects.all()) 

    def __init__(self, *args, **kwargs): 
     super(adminStudentForm, self).__init__(*args, **kwargs) 
     if self.instance: 

      self.fields['patients'].initial = self.instance.modelpatient_set.all() 

    def save(self, *args, **kwargs): 
     try: 
      instance = super(adminStudentForm, self).save(commit=False) 
      self.fields['patients'].initial.update(student=None) <-------EXCEPTION HERE 
      self.cleaned_data['patients'].update(student=instance) 
     except Exception as e: 
      print(e) 
     return instance 

et ceci est l'interface enregistrée

pièce C:

class modelStudentAdmin(admin.ModelAdmin): 
    form = adminStudentForm 
    search_fields = ('first_name','user__username') 
#What records to show when the model is clicked in the admin 
#The super user should get everything and staff should get limited data 
def get_queryset(self, request): 
    qs = super(modelStudentAdmin, self).get_queryset(request) 

    if request.user.is_superuser: 
     return qs 
    else: 
     # Get the school instance 
     # Only show the students that belong to this school 
     schoolInstance = modelSchool.objects.get(user=request.user) 
     qs = modelStudent.objects.filter(school=schoolInstance) 
     return qs 

#Limit the no. of options of Foreign Key that could be assigned 
def formfield_for_foreignkey(self, db_field, request, **kwargs): 
    if request.user.is_superuser: 
     return super(modelStudentAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs) 

    #Not superuser only staff 
    #Check what fields to pull out for field school 
    if db_field.name == 'school': 
     kwargs['queryset'] = modelSchool.objects.filter(user=request.user) 

    # Check what fields to pull out for field user 
    elif db_field.name == 'user': 
     t = modelSchool.objects.filter(user=request.user) 
     kwargs['queryset'] = User.objects.filter(modelschool=t) 

    return super(modelStudentAdmin,self).formfield_for_foreignkey(db_field, request, **kwargs) 

Puis j'enregistrer le modèle comme ceci:

admin.site.register(modelStudent,modelStudentAdmin) 

Bref pourquoi j'obtiens une erreur de

Impossible de mettre à jour le modèle champ (seulement non les relations et les clés étrangères autorisées).

dans mon application admin lorsque je tente de sauver le modèle puisque j'ai changé ForeignKey à ManyToMany suggestions de relationship.Any sur la façon dont je peux résoudre ce problème?

+0

Avez-vous ajouté des migrations après avoir modifié le type de terrain? –

+0

oui j'ai fait des makemigrations et j'ai migré sans aucune erreur rapportée –

+0

Qu'est-ce que 'student = student = None'? –

Répondre

0

Correction du problème. Le problème est django ne supporte pas la mise à jour en vrac pour les champs ManyToMany source

fixe ce de la manière suivante

def save(self, *args, **kwargs): 
    try: 
     instance = super(adminStudentForm, self).save(commit=False) 
     patients_qset = self.cleaned_data['patients'] 
     for pqset in patients_qset: 
      pqset.student.add(instance) 

    except Exception as e: 
     print(e) 
     raise 
    return instance