मैंने Django मॉडल के साथ __getattr__
का उपयोग कर लोगों के ऑनलाइन उदाहरण देखे हैं, लेकिन जब भी मैं कोशिश करता हूं तो मुझे त्रुटियां मिलती हैं। (Django 1.2.3)मैं Django मॉडल के साथ __getattr__ का उपयोग क्यों नहीं कर सकता?
मुझे कोई समस्या नहीं है जब मैं सामान्य वस्तुओं पर __getattr__
का उपयोग कर रहा हूं।
class Post(object):
def __getattr__(self, name):
return 42
वर्क्स ठीक ...
>>> from blog.models import Post >>> p = Post() >>> p.random 42
अब जब मैं एक Django मॉडल के साथ प्रयास करें:
from django.db import models
class Post(models.Model):
def __getattr__(self, name):
return 42
और व्याख्याता का उस पर परीक्षण:
उदाहरण के लिए>>> from blog.models import Post >>> p = Post() ERROR: An unexpected error occurred while tokenizing input The
following traceback may be corrupted or invalid The error message is: ('EOF in multi-line statement', (6, 0))
--------------------------------------------------------------------------- TypeError
Traceback (most recent call last)/Users/josh/project/ in()
/Users/josh/project/lib/python2.6/site-packages/django/db/models/base.pyc in init(self, *args, **kwargs) 338 if kwargs: 339 raise TypeError("'%s' is an invalid keyword argument for this function" % kwargs.keys()[0]) --> 340 signals.post_init.send(sender=self.class, instance=self) 341 342 def repr(self):
/Users/josh/project/lib/python2.6/site-packages/django/dispatch/dispatcher.pyc in send(self, sender, **named) 160 161 for receiver in self._live_receivers(_make_id(sender)): --> 162 response = receiver(signal=self, sender=sender, **named) 163 responses.append((receiver, response)) 164 return responses
/Users/josh/project/python2.6/site-packages/photologue/models.pyc in add_methods(sender, instance, signal, *args, **kwargs) 728 """ 729 if hasattr(instance, 'add_accessor_methods'): --> 730 instance.add_accessor_methods() 731 732 # connect the add_accessor_methods function to the post_init signal
TypeError: 'int' object is not callable
कोई बता सकता है कि क्या चल रहा है जी पर?
संपादित करें: मैं उदाहरण में भी सार हो सकता है, यहाँ कुछ कोड है कि क्या मैं वास्तव में वेबसाइट पर प्रयोग करेंगे के करीब है:
class Post(models.Model):
title = models.CharField(max_length=255)
slug = models.SlugField()
date_published = models.DateTimeField()
content = RichTextField('Content', blank=True, null=True)
# Etc...
Class CuratedPost(models.Model):
post = models.ForeignKey('Post')
position = models.PositiveSmallIntegerField()
def __getattr__(self, name):
''' If the user tries to access a property of the CuratedPost, return the property of the Post instead... '''
return self.post.name
# Etc...
जब मैं एक बना सकते हैं पोस्ट क्लास की प्रत्येक विशेषता के लिए संपत्ति, जो बहुत सारे कोड डुप्लिकेशंस का कारण बनती है। और भी, इसका मतलब यह होगा कि जब भी मैं पोस्ट क्लास की विशेषता जोड़ता हूं या संपादित करता हूं तो मुझे क्यूरेटेड पोस्ट क्लास में एक ही बदलाव करना याद रखना होगा, जो कोड रोट के लिए नुस्खा जैसा लगता है।
कि वास्तव में "वापसी self.post.name" क्या है? यह "वापसी getattr (self.post, name)" –
होना चाहिए, वास्तव में, कोड – Joshmaker