2017-03-12 2 views
0

ich Hilfe benötigen unter save_model Methode auf Django Rastrahmen bei der Umwandlung von Ich habe diese Methode auf meinem früheren django Modell AdminNeed Assistane bei der Umwandlung von django Modell Admin-Methode Django übriges Rahmen speichern

Bestehende Modeladmin

class JobCategoryAdmin(admin.ModelAdmin): 
    exclude = ('remote_addr',) 
    list_display = ['job_category','updated_by','updated_at','created_by','created_at','remote_addr',] 
    save_as = True 

    def save_model(self, request, obj, form, change): 
     if change: #When update 
      obj.updated_by = request.user 
      obj.updated_at = datetime.now() 
      obj.remote_addr = request.META['REMOTE_ADDR'] 
     else:  #When Create 
      obj.created_by = request.user 
      obj.created_at = datetime.now() 
      obj.updated_by = request.user 
      obj.remote_addr = request.META['REMOTE_ADDR'] 
     obj.save() 

Ich muss dies auf meine DRF-Methode anwenden. Momentan mache ich das so.

Serializer

class JobCategorySerializer(serializers.ModelSerializer): 
    class Meta: 
     model = JobCategory 
     fields = ('job_category',) 

    def create(self,validated_data): 
     obj = JobCategory.objects.create(**validated_data) 
     obj.created_by = self.context['request'].user 
     obj.updated_by = self.context['request'].user 
     obj.remote_addr = self.context['request'].META['REMOTE_ADDR'] 
     obj.save() 
     return obj 

    def update(self,instance,validated_data): 
     obj = instance 
     obj.job_category = validated_data.get('job_category', obj.job_category) 
     obj.updated_by = self.context['request'].user 
     obj.remote_addr = self.context['request'].META['REMOTE_ADDR'] 
     obj.save() 
     return obj 

Hier bin ich mit dem Update nicht wohl, weil ich einmal alle Daten übergeben müssen wieder die ich in meinem bestehenden Modeladmin Methode von save_model nicht tun. Beispiel ob_category Feld wenn ich von X auf Y aktualisiere Ich möchte dies nicht in meiner Update Methode aufrufen.

Wenn es ein Feld ist, ist es immer noch akzeptabel, aber wenn ich für ein Modell tun muss, wo es 20 Felder sagen darf und ich nur ein Feld unter diesen aktualisieren, dann muss ich alle Felder in meinem Update angeben Methode.

Modell

class JobCategory(models.Model): 
    job_category = models.CharField(max_length=30,blank=False,null=False, unique=True,help_text="eg: DATASTAGE, CUSTOM_COMMAND") 
    created_by = models.ForeignKey(User, related_name='const_jc_created_by_user',blank=True, null=True, default=None, editable=False) 
    updated_by = models.ForeignKey(User, related_name='const_jc_updated_by_user', blank=True, null=True, default=None, editable=False) 
    created_at = models.DateTimeField(auto_now_add=True) 
    updated_at = models.DateTimeField(auto_now=True) 
    remote_addr = models.CharField(blank=True, default='',max_length=100) 

    class Meta: 
     ordering = ["job_category"] 
     verbose_name_plural = "Job Categories" 

    def __str__(self):    # __unicode__ on Python 2 
     return self.job_category 

Ansicht

class JobCategoryDetail(generics.RetrieveUpdateDestroyAPIView): 
    queryset = JobCategory.objects.all() 
    serializer_class = JobCategorySerializer 

Vielen Dank für Ihre Unterstützung

Antwort

1

Wenn es ein Feld ist, ist es immer noch akzeptabel, aber wenn ich brauche für ein Modell zu tun wo es 20 Felder haben lässt und ich nur ein Feld unter diesen aktualisiere, dann muss ich alle Felder in meiner Update-Methode angeben.

Dies wird einfach mit gelöst:

for attr in ('job_category', ...): 
    setattr(obj, attr, validated_data.get(attr, getattr(obj, attr)) 

Beachten Sie, dass Sie auf validated_data.keys auch Schleife könnte() es allgemeinere zu machen.

+0

Vielen Dank für den Vorschlag. Das Durchlaufen von valided_data.keys() funktionierte für mich. ######### 'für attr in validated_data.keys(): setattr (obj, attr, validated_data.get (attr, getattr (obj, attr)))' #### ####### – just10minutes

Verwandte Themen