开发者

Django QuerySets - with a class method

开发者 https://www.devze.com 2023-04-08 08:18 出处:网络
Below is a stripped down model and associated method.I am looking for a simple way upon executing a query to get all of the needed information in a single answer without having to re-query everything.

Below is a stripped down model and associated method. I am looking for a simple way upon executing a query to get all of the needed information in a single answer without having to re-query everything. The challenge here is the value is depende开发者_StackOverflow社区nt upon the signedness of value_id.

class Property(models.Model):
    property_definition = models.ForeignKey(PropertyDefinition)
    owner = models.IntegerField()
    value_id = models.IntegerField()

    def get_value(self):
        if self.value_id < 0: return PropertyLong.objects.get(id=-self.value_id)
        else: return PropertyShort.objects.get(id=self.value_id)

Right now to get the "value" I need to do this:

object = Property.objects.get(property_definition__name="foo")
print object.get_value()

Can someone provide a cleaner way to solve this or is it "good" enough? Ideally I would like to simply just do this.

object = Property.objects.get(property_definition__name="foo")
object.value

Thanks


Given this is a bad design. You can use the builtin property decorator for your method to make it act as a property.

class Property(models.Model):
    property_definition = models.ForeignKey(PropertyDefinition)
    owner = models.IntegerField()
    value_id = models.IntegerField()

    @property
    def value(self):
        if self.value_id < 0: return PropertyLong.objects.get(id=-self.value_id)
        else: return PropertyShort.objects.get(id=self.value_id)

This would enable you to do what you'd ideally like to do: Property.objects.get(pk=1).value

But I would go as far as to call this "cleaner". ;-)

You could go further and write your own custom model field by extending django.models.Field to hide the nastiness in your schema behind an API. This would at least give you the API you want now, so you can migrate the nastiness out later.

That or the Generic Keys mentioned by others. Choose your poison...


this is a bad design. as Daniel Roseman said, take a look at generic foreign keys if you must reference two different models from the same field.

https://docs.djangoproject.com/en/1.3/ref/contrib/contenttypes/#generic-relations


Model inheritance could be used since value is not a Field instance.

0

精彩评论

暂无评论...
验证码 换一张
取 消