2011-06-17 12 views
18

मेरे पास एक छोटा सा एप्लिकेशन है जो उपयोगकर्ता को वीडियो रेट करने की अनुमति देता है।Django - डुप्लिकेट कुंजी पर सहेजें() अद्यतन

उपयोगकर्ता केवल एक बार रेट कर सकते हैं। इसलिए मैंने मॉडल पर विशिष्टता परिभाषित की है।

लेकिन वह अपनी दर बदल सकता है। तो save() नकली चाबी

class VideoRate(models.Model): 
    """Users can Rate each Video on the criterias defined for the topic""" 
    user = models.ForeignKey(User) 
    video = models.ForeignKey(VideoFile) 
    crit = models.ForeignKey(VideoCrit) 
    rate = models.DecimalField(max_digits=2, decimal_places=1, choices=RATE_CHOICES) 
    class Meta: 
    unique_together = (('user', 'video', 'crit'),) 
    verbose_name = 'Video Rating' 

पर अद्यतन करना चाहिए अगर मैं

rate = VideoRate(user_id=1, video_id=1, crit_id=1, rate=2) 
rate.save() 

यह रेटिंग बचत है, लेकिन अगर मैं

rate = VideoRate(user_id=1, video_id=1, crit_id=1, rate=3) 
rate.save() 

मैं सामान्य त्रुटि मिलती है

IntegrityError: (1062, "Duplicate entry '1-1-1' for key 'user_id'") 

भले ही मैं force_update=True (केवल प्राथमिक कुंजी पर आधारित) का उपयोग करता हूं

क्या रेटिंग अपडेट करने का कोई तरीका है यदि यह पहले से डेटा जांचने के बिना मौजूद है?

उत्तर

28

मौजूदा रेटिंग को अपडेट करने के लिए, आपको वास्तव में वह अपडेट करना होगा जिसे आप अपडेट करना चाहते हैं। क्या आप जानते हैं ऑब्जेक्ट मौजूद नहीं कर सकते हैं, तो get_or_create का उपयोग करें:

rate, created = VideoRate.objects.get_or_create(user_id=1, video_id=1, crit_id=1) 
rate.rate = 2 
rate.save() 

आप कम कटौती कर सकते हैं प्रक्रिया update() का उपयोग करके:

VideoRate.objects.filter(user_id=1, video_id=1, crit_id=1).update(rate=2) 

लेकिन अगर रेटिंग अस्तित्व में नहीं है यह चुपचाप असफल हो जायेगी - यह एक नहीं बनाएगा।

+0

+1: पहला विकल्प 2 या 3 प्रश्न करेगा, जबकि दूसरा करेगा 1. – sdolan

+0

खराब नहीं लगता है। आपका मतलब है कि Django एक 'INSERT नहीं कर सकता ... डिप्लिकेट कुंजी अपडेट पर ...'? –

+3

नहीं, क्योंकि यह एक MySQL- विशिष्ट एक्सटेंशन है, और Django डेटाबेस की एक श्रृंखला के साथ काम करता है। –

7

सबसे पहले, आपको यह जांचना होगा कि रेटिंग मौजूद है या नहीं। तो अगर आप उपयोग कर सकते हैं या तो क्या डैनियल Roseman कहा या का उपयोग मौजूद, लेकिन जब से अद्यतन नया रिकॉर्ड बनाने नहीं है आप एक सरल अद्यतन के साथ इस का समाधान नहीं कर सकते हैं ...

rating = 2 
rate, created = VideoRate.objects.get_or_create(user_id=1, video_id=1, crit_id=1, 
    defaults={'rate':rating})#if create, also save the rate infdormation 

if not created:# update 
    rate.rate = rating 
    rate.save() 

आप चूक उपयोग कर सकते हैं , exrta तर्क पारित करने के लिए, इसलिए यदि यह एक डालने है, डेटाबेस रिकॉर्ड सभी आवश्यक जानकारी के साथ बनाया जाएगा और आप इसे फिर से अद्यतन करने की आवश्यकता नहीं है ...

Documentation

अद्यतन: यह उत्तर प्रश्न की तरह काफी पुराना है। @ पीटरेटरमासेन का उल्लेख है, डीजेगो में अब update_or_create() विधि

+0

'डिफ़ॉल्ट' कीवर्ड भी बहुत दिलचस्प है –

+1

'डिफ़ॉल्ट' तर्क से मान का उपयोग उस स्थिति में अद्यतन करने के लिए भी किया जाता है जहां ऑब्जेक्ट को डेटाबेस में बनाने की आवश्यकता नहीं है, https://docs.djangoproject.com देखें /en/1.11/ref/models/querysets/#update-or-create। नतीजतन, आपके कोड का 'if' हिस्सा नो-ऑप है। अधिसूचना के लिए – peterthomassen

+0

@ पीटरेटरमासेन धन्यवाद। उत्तर अपडेट किया गया। – FallenAngel

संबंधित मुद्दे