জ্যাঙ্গো। মডেলের জন্য সংরক্ষণের ওভাররাইড করুন


134

মডেল সংরক্ষণের আগে আমি একটি চিত্র পুনরায় আকারের। তবে কীভাবে আমি নতুন ছবি যুক্ত হয়েছে বা কেবল বিবরণ আপডেট হয়েছে কিনা তা আমি কীভাবে পরীক্ষা করতে পারি, তাই প্রতিবার মডেলটি সংরক্ষণ করার পরে আমি পুনরুদ্ধার করা এড়াতে পারি?

class Model(model.Model):
    image=models.ImageField(upload_to='folder')
    thumb=models.ImageField(upload_to='folder')
    description=models.CharField()


    def save(self, *args, **kwargs):
        if self.image:
            small=rescale_image(self.image,width=100,height=100)
            self.image_small=SimpleUploadedFile(name,small_pic)
        super(Model, self).save(*args, **kwargs)

আমি কেবল নতুন চিত্র লোড করা বা চিত্র আপডেট হলেই পুনরুদ্ধার করতে চাই, তবে বিবরণ আপডেট হওয়ার পরে নয়।


আপনি কি 100x100 এর একটি নির্দিষ্ট আকারের আকার পরিবর্তন করছেন?
বিডিডি

3
আপনি জ্যাঙ্গো-ইমেজকিটটি দরকারী খুঁজে পেতে পারেন
ভাইকিংগোন্ডো

উত্তর:


135

কিছু চিন্তা:

class Model(model.Model):
    _image=models.ImageField(upload_to='folder')
    thumb=models.ImageField(upload_to='folder')
    description=models.CharField()

    def set_image(self, val):
        self._image = val
        self._image_changed = True

        # Or put whole logic in here
        small = rescale_image(self.image,width=100,height=100)
        self.image_small=SimpleUploadedFile(name,small_pic)

    def get_image(self):
        return self._image

    image = property(get_image, set_image)

    # this is not needed if small_image is created at set_image
    def save(self, *args, **kwargs):
        if getattr(self, '_image_changed', True):
            small=rescale_image(self.image,width=100,height=100)
            self.image_small=SimpleUploadedFile(name,small_pic)
        super(Model, self).save(*args, **kwargs)

নিশ্চিত নয় যে এটি সমস্ত সিউডো-অটো জ্যাঙ্গো সরঞ্জাম (উদাহরণ: মডেলফর্ম, অবদান.এডমিন ইত্যাদি) দিয়ে দুর্দান্ত খেলবে কিনা Not


1
ভাল দেখাচ্ছে. তবে আমি ইমেজটির নাম পরিবর্তন করতে পারি না। এটা কি গুরুত্বপূর্ণ?
পোল

ঠিক আছে আমি db_column = 'চিত্র' দিয়ে এটিকে সমাধান করেছি। তবে এটি স্টিল কাজ করে না!
পোল

1
এটি খুব আকর্ষণীয় পদ্ধতি .. আমি এটি পুরোপুরি বুঝতে পারি না। আপনি দয়া করে আরও স্পষ্ট করে ব্যাখ্যা করতে পারেন? বা কিছু নিবন্ধ বপন?
পোল

এটা আমার জন্যও কাজ হয় না,। set_image কখনও কল করা হয়নি। দেখে মনে হচ্ছে কিছু জ্যাঙ্গো আনুষ্ঠানিকভাবে সমর্থিত
স্টাফগুলিতে

16

মডেলের পিকে ক্ষেত্রটি পরীক্ষা করুন। যদি এটি না হয় তবে এটি একটি নতুন অবজেক্ট।

class Model(model.Model):
    image=models.ImageField(upload_to='folder')
    thumb=models.ImageField(upload_to='folder')
    description=models.CharField()


    def save(self, *args, **kwargs):
        if 'form' in kwargs:
            form=kwargs['form']
        else:
            form=None

        if self.pk is None and form is not None and 'image' in form.changed_data:
            small=rescale_image(self.image,width=100,height=100)
            self.image_small=SimpleUploadedFile(name,small_pic)
        super(Model, self).save(*args, **kwargs)

সম্পাদনা করুন: আমি formChanged_data 'চিত্রের' জন্য একটি চেক যুক্ত করেছি। এটি ধরে নেওয়া হয় যে আপনি আপনার চিত্রগুলি আপডেট করতে প্রশাসক সাইটটি ব্যবহার করছেন। নীচে উল্লিখিত হিসাবে আপনাকে ডিফল্ট save_model পদ্ধতি ওভাররাইড করতে হবে।

class ModelAdmin(admin.ModelAdmin):
    def save_model(self, request, obj, form, change):
        obj.save(form=form)

আমি মনে করি আপনি ঠিক বলেছেন ... তিনি অ্যাডমিন সাইটটি ব্যবহার করছেন বলে ধরে নিচ্ছেন, তিনি সেভ করার জন্য ফর্মটি পাস করার জন্য তার প্রশাসকমোডলে সেভ_মডেলটিকে ওভাররাইড করতে পারবেন এবং 'চিত্র' ফর্ম-চেঞ্জড_ডেটায় আছে কিনা তা পরীক্ষা করতে পারেন। সময় পেলেই আমি আপডেট করব।
ডিএম কবরগুলি

এটি কেবল তখনই কাজ করে যদি আপনি যেমন বলে থাকেন তেমন নতুন হয়। আপনি যদি কোনও নতুন ছবি আপলোড করেন তবে উদ্ধারটি ট্রিগার করবে না।
জোনাথন

2
আইডি নির্দিষ্ট করে রাখলে "সেলফ.পি.কেই কোনও নয়" কাজ করে না, সুতরাং: Model.objects.get_or_create (id = 234, ...) এই দ্রষ্টব্যটিতে কাজ করবে না
বাদাম

6

আপনি একটি নতুন চিত্র পোস্ট করা হয়েছে তা নিশ্চিত করার জন্য অতিরিক্ত যুক্তি সরবরাহ করতে পারে।
কিছুটা এইরকম:

def save(self, new_image=False, *args, **kwargs):
    if new_image:
        small=rescale_image(self.image,width=100,height=100)
        self.image_small=SimpleUploadedFile(name,small_pic)
    super(Model, self).save(*args, **kwargs)

বা অনুরোধ ভেরিয়েবল পাস

def save(self, request=False, *args, **kwargs):
    if request and request.FILES.get('image',False):
        small=rescale_image(self.image,width=100,height=100)
        self.image_small=SimpleUploadedFile(name,small_pic)
    super(Model, self).save(*args, **kwargs)

আমি মনে করি এইগুলি যখন সরলভাবে ডাকা হয় তখন আপনার সংরক্ষণকে ভঙ্গ করে না।

আপনি এটি আপনার অ্যাডমিন.পিতে রাখতে পারেন যাতে অ্যাডমিন সাইটের সাথেও এটি কাজ করে (উপরের সমাধানগুলির দ্বিতীয়টির জন্য):

class ModelAdmin(admin.ModelAdmin):

    ....
    def save_model(self, request, obj, form, change): 
        instance = form.save(commit=False)
        instance.save(request=request)
        return instance

এটি আমাকে বলে যে: 'ডাব্লুএসজিআরআইকুয়েস্ট' অবজেক্টটির কোনও 'ফাইল' নেই
পোল

sry ফাইল পরিবর্তে তার ফাইল, request.FILES.get ( 'ইমেজ', মিথ্যা) পরিবর্তে request.FILES [ 'চিত্র'] আপডেট, এই ব্যতিক্রম এড়াতে হবে
crodjer

3

লক্ষ্য অর্জনের জন্য আমি যা করেছি তা হ'ল এটি ..

# I added an extra_command argument that defaults to blank
def save(self, extra_command="", *args, **kwargs):

এবং সেভ () পদ্ধতির নীচে এইটি ..

# override the save method to create an image thumbnail
if self.image and extra_command != "skip creating photo thumbnail":
    # your logic here

সুতরাং আমি যখন কিছু ক্ষেত্র সম্পাদনা করি তবে চিত্রটি সম্পাদনা করি না তখন আমি এটি রাখি ..

Model.save("skip creating photo thumbnail")

আপনি এর "skip creating photo thumbnail"সাথে "im just editing the description"বা আরও একটি আনুষ্ঠানিক পাঠ্য প্রতিস্থাপন করতে পারেন ।

আশা করি এই সাহায্য করবে!


2

একই পিকে সাথে বিদ্যমান রেকর্ডের জন্য ডাটাবেসটি জিজ্ঞাসা করুন। নতুন এবং বিদ্যমান চিত্রগুলির ফাইলের আকার এবং চেকসামগুলির তুলনা করুন সেগুলি একই কিনা তা দেখতে।


1

জ্যাঙ্গো 3: পূর্বনির্ধারিত মডেল পদ্ধতির ওভাররাইড

from django.db import models

class Blog(models.Model):
    name = models.CharField(max_length=100)
    tagline = models.TextField()

    def save(self, *args, **kwargs):
        do_something()
        super().save(*args, **kwargs)  # Call the "real" save() method.
        do_something_else()

সুপারক্লাস পদ্ধতিটি কল করা মনে রাখা জরুরী - এটাই সেই super().save(*args, **kwargs)ব্যবসা - এটি নিশ্চিত করার জন্য যে অবজেক্টটি এখনও ডাটাবেসে সংরক্ষণ করে। আপনি যদি সুপারক্লাস পদ্ধতিতে কল করতে ভুলে যান তবে ডিফল্ট আচরণটি ঘটবে না এবং ডাটাবেস স্পর্শ করবে না।


0

নতুন সংস্করণে এটি এরকম:

def validate(self, attrs):
    has_unknown_fields = set(self.initial_data) - set(self.fields.keys())
    if has_unknown_fields:
        raise serializers.ValidationError("Do not send extra fields")
    return attrs

0

ডাটাবেসে ডেটা সংরক্ষণ করার জন্য আমি আরও একটি সহজ উপায় খুঁজে পেয়েছি

models.py

class LinkModel(models.Model):
    link = models.CharField(max_length=500)
    shortLink = models.CharField(max_length=30,unique=True)

ডাটাবেসে আমার 2 টি ভেরিয়েবল রয়েছে

views.py

class HomeView(TemplateView):
    def post(self,request, *args, **kwargs):
        form = LinkForm(request.POST)

        if form.is_valid():
            text = form.cleaned_data['link'] # text for link

        dbobj = LinkModel()
        dbobj.link = text
        self.no = self.gen.generateShortLink() # no for shortLink
        dbobj.shortLink = str(self.no)
        dbobj.save()         # Saving from views.py

এটিতে আমি কেবল ভিউ.পি-তে মডেলগুলির উদাহরণ তৈরি করেছি এবং কেবলমাত্র দর্শন থেকে 2 ভেরিয়েবলের মধ্যে ডেটা স্থাপন / সংরক্ষণ করি।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.