web/lib/django/db/models/related.py
changeset 0 0d40e90630ef
child 29 cc9b7e14412b
equal deleted inserted replaced
-1:000000000000 0:0d40e90630ef
       
     1 class BoundRelatedObject(object):
       
     2     def __init__(self, related_object, field_mapping, original):
       
     3         self.relation = related_object
       
     4         self.field_mappings = field_mapping[related_object.name]
       
     5 
       
     6     def template_name(self):
       
     7         raise NotImplementedError
       
     8 
       
     9     def __repr__(self):
       
    10         return repr(self.__dict__)
       
    11 
       
    12 class RelatedObject(object):
       
    13     def __init__(self, parent_model, model, field):
       
    14         self.parent_model = parent_model
       
    15         self.model = model
       
    16         self.opts = model._meta
       
    17         self.field = field
       
    18         self.name = '%s:%s' % (self.opts.app_label, self.opts.module_name)
       
    19         self.var_name = self.opts.object_name.lower()
       
    20 
       
    21     def get_db_prep_lookup(self, lookup_type, value):
       
    22         # Defer to the actual field definition for db prep
       
    23         return self.field.get_db_prep_lookup(lookup_type, value)
       
    24 
       
    25     def editable_fields(self):
       
    26         "Get the fields in this class that should be edited inline."
       
    27         return [f for f in self.opts.fields + self.opts.many_to_many if f.editable and f != self.field]
       
    28 
       
    29     def __repr__(self):
       
    30         return "<RelatedObject: %s related to %s>" % (self.name, self.field.name)
       
    31 
       
    32     def bind(self, field_mapping, original, bound_related_object_class=BoundRelatedObject):
       
    33         return bound_related_object_class(self, field_mapping, original)
       
    34 
       
    35     def get_accessor_name(self):
       
    36         # This method encapsulates the logic that decides what name to give an
       
    37         # accessor descriptor that retrieves related many-to-one or
       
    38         # many-to-many objects. It uses the lower-cased object_name + "_set",
       
    39         # but this can be overridden with the "related_name" option.
       
    40         if self.field.rel.multiple:
       
    41             # If this is a symmetrical m2m relation on self, there is no reverse accessor.
       
    42             if getattr(self.field.rel, 'symmetrical', False) and self.model == self.parent_model:
       
    43                 return None
       
    44             return self.field.rel.related_name or (self.opts.object_name.lower() + '_set')
       
    45         else:
       
    46             return self.field.rel.related_name or (self.opts.object_name.lower())