Hi,

I am trying to make a django model that will show data from different
other models as a single model. Kind of like a database view to a
database table.

My idea is to make a custom field that maps to another field in some
other model

code for fields.py is as follows
---------------------------------------------------------------------------------------
from django.db import models
from django.db.models import get_model

class ViewField(models.Field):
    def __init__(self, *args, **kwargs):
        model = get_model(kwargs['app'], kwargs['model'])
        if '__' in kwargs['field']:
            self.var_name, self.field_name = kwargs['field'].split
('__')
        else:
            self.var_name = ''
            self.field_name = kwargs['field']

        for field in model._meta.fields:
            if field.name == self.field_name:
                self._field = field
                break
        else:
            return None
        del(kwargs['app'])
        del(kwargs['model'])
        del(kwargs['field'])
        super(ViewField, self).__init__(*args, **kwargs)

    def db_type(self):
        return self._field.db_type()

    def to_python(self, value):
        return self._field.to_python(value)

    def get_db_prep_value(self, value):
        return self._field.get_db_prep_value(value)

    def get_db_prep_lookup(self, lookup_type, value):
        return self._field.get_db_prep_lookup(lookup_type, value)

    def formfield(self, **kwargs):
        return self._field.formfield(**kwargs)

    def get_internal_type(self):
        return self._field.get_internal_type()

    def value_to_string(self, obj):
        return self._field.value_to_string(obj)

    def contribute_to_class(self, cls, name):
        return self._field.contribute_to_class(cls, name)
---------------------------------------------------------------------------------------
I ve also made a custom manager. its code is as follows
---------------------------------------------------------------------------------------
from django.db.models import get_model
class ViewModelManager(models.Manager):
    def __init__(self, *args, **kwargs):
        self._model = get_model(kwargs['app'], kwargs['model'])
        del(kwargs['app'])
        del(kwargs['model'])
        super(ViewModelManager, self).__init__(*args, **kwargs)

    def get_query_set(self):
        return self._model.objects.get_query_set()

    def get_empty_query_set(self):
        return self._model.objects.get_empty_query_set()

    def none(self):
        return self._model.objects.none()

    def all(self):
        return self._model.objects.all()

    def count(self):
        return self._model.objects.count()

    def dates(self, *args, **kwargs):
        return self._model.objects.dates(*args, **kwargs)

    def distinct(self, *args, **kwargs):
        return self._model.objects.distinct(*args, **kwargs)

    def extra(self, *args, **kwargs):
        return self._model.objects.extra(*args, **kwargs)

    def get(self, *args, **kwargs):
        return self._model.objects.get(*args, **kwargs)

    def get_or_create(self, **kwargs):
        return self._model.objects.get_or_create(**kwargs)

    def create(self, **kwargs):
        return self._model.objects.create(**kwargs)

    def filter(self, *args, **kwargs):
        return self._model.objects.filter(*args, **kwargs)

    def aggregate(self, *args, **kwargs):
        return self._model.objects.aggregate(*args, **kwargs)

    def annotate(self, *args, **kwargs):
        return self._model.objects.annotate(*args, **kwargs)

    def complex_filter(self, *args, **kwargs):
        return self._model.objects.complex_filter(*args, **kwargs)

    def exclude(self, *args, **kwargs):
        return self._model.objects.exclude(*args, **kwargs)

    def in_bulk(self, *args, **kwargs):
        return self._model.objects.in_bulk(*args, **kwargs)

    def iterator(self, *args, **kwargs):
        return self._model.objects.iterator(*args, **kwargs)

    def latest(self, *args, **kwargs):
        return self._model.objects.latest(*args, **kwargs)

    def order_by(self, *args, **kwargs):
        return self._model.objects.order_by(*args, **kwargs)

    def select_related(self, *args, **kwargs):
        return self._model.objects.select_related(*args, **kwargs)

    def values(self, *args, **kwargs):
        return self._model.objects.values(*args, **kwargs)

    def values_list(self, *args, **kwargs):
        return self._model.objects.values_list(*args, **kwargs)

    def update(self, *args, **kwargs):
        return self._model.objects.update(*args, **kwargs)

    def reverse(self, *args, **kwargs):
        return self._model.objects.reverse(*args, **kwargs)

    def defer(self, *args, **kwargs):
        return self._model.objects.defer(*args, **kwargs)

    def only(self, *args, **kwargs):
        return self._model.objects.only(*args, **kwargs)

    def _insert(self, values, **kwargs):
        return self._model.objects._insert(values, **kwargs)

    def _update(self, values, **kwargs):
        return self._model.objects._insert(values, **kwargs)
---------------------------------------------------------------------------------------
To make a view of a model Visit, I have the following code
---------------------------------------------------------------------------------------
from fields import ViewField
from models import ViewModelManager
class VisitView(models.Model):
    id = ViewField(app = 'patient', model = 'visit', field = 'id',
primary_key = True)
    name = ViewField(app = 'patient', model = 'patient', field =
'patient__name')
    fee = ViewField(app = 'patient', model = 'visit', field = 'fee')
    _base_manager = ViewModelManager(app = 'patient', model = 'visit')

    def __unicode__(self):
        return '%s' % self.id

    class Meta:
        managed = False
---------------------------------------------------------------------------------------

I am new to django, so i dont know if my approach is correct.
Any guidance is welcome

peace
goto

--

You received this message because you are subscribed to the Google Groups 
"Django users" group.
To post to this group, send email to django-us...@googlegroups.com.
To unsubscribe from this group, send email to 
django-users+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/django-users?hl=en.


Reply via email to