2017-03-01 60 views
0

限定通用管理用下面的代码和限定每个每类合适NATURAL_KEY失败(而不是定义在每个类不同的经理,其复制相同的代码):Django的:在一个抽象模型

class NexchangeManager(models.Manager): 
    def get_by_natural_key(self, param): 
     if param == "*": 
      return self.all() 
     lookup = {self.NATURAL_KEY: param} 
     return self.get(**lookup) 


class NexchangeModel(models.Model): 
    class Meta: 
     abstract = True 
    objects = NexchangeManager() 

Djagno虽然NexhcnageModel是一个抽象模型,但抱怨字段复制。 我应该用mixin代替吗?

错误:

django.core.serializers.base.DeserializationError: Problem installing fixture '/Users/beoleg/dev/nexchange/core/fixtures/pairs_cross.json': 'NexchangeManager' object has no attribute 'NATURAL_KEY': (core.pair:pk=1) field_value was '['LTC']' 

这样做的目的,乍一看有点过于复杂的代码,有这样的事情在我的灯具:

[ 
    { 
    "model": "payments.paymentpreference", 
    "pk": 8, 
    "fields": { 
     "user": ["onit"], 
     "identifier": "[email protected]", 
     "payment_method": 12, 
     "comment": "Please send the funds as a personal payment (this is a precaution to prevent charge backs, payments for goods and services will be automatically declined)", 
     "currency": [ 
      ["*"] 
     ], 
     "created_on":"2016-11-01T17:41:28+00:00", 
     "modified_on":"2016-11-01T17:41:28+00:00" 
    } 
    } 
] 

Instaed的:

[ 
    { 
    "model": "payments.paymentpreference", 
    "pk": 8, 
    "fields": { 
     "user": ["onit"], 
     "identifier": "[email protected]", 
     "payment_method": 12, 
     "comment": "Please send the funds as a personal payment (this is a precaution to prevent charge backs, payments for goods and services will be automatically declined)", 
     "currency": [ 
     ["USD"], 
     ["RUB"], 
     ["EUR"], 
     ["GBP"], 
     ["JPY"], 
     ["HRK"], 
     ["CHF"], 
     ["PLN"], 
     ["RON"], 
     ["BGN"], 
     ["CZK"], 
     ["AUD"], 
     ["CAD"], 
     ["NOK"], 
     ["SEK"], 
     ["DKK"], 
     ["HUF"], 
     ["TRY"], 
     ["ZAR"], 
     ["NZD"], 
     ["BRL"], 
     ["IDR"], 
     ["ILS"], 
     ["INR"], 
     ["KRW"], 
     ["MXN"], 
     ["MYR"], 
     ["PHP"], 
     ["THB"] 
     ], 
     "created_on":"2016-11-01T17:41:28+00:00", 
     "modified_on":"2016-11-01T17:41:28+00:00" 
    } 
    } 
] 
+0

失败怎么办?显示实际的错误。并举例说明您如何以及在哪里定义NATURAL_KEY。 –

+0

@DanielRoseman编辑!谢谢! –

回答

1

我不明白你写你的经理的方式。如果NATURAL_KEY是每个模型的属性,我会写:

class NexchangeManager(models.Manager): 
    def get_by_natural_key(self, param): 
     qs = self.get_queryset() 
     if param == "*": 
      return qs.all() 
     lookup = {qs.model.NATURAL_KEY: param} 
     return qs.filter(**lookup) 
+0

django.core.serializers.base.DeserializationError:安装fixture的问题'/Users/beoleg/dev/nexchange/core/fixtures/pairs_cross.json':'QuerySet'对象没有属性'id':(core.pair:pk = 1)field_value是'['BTC']' –

0

注:这个答案是基于albars答案,但改善了允许PK PARAMS。

经理:

class NexchangeManager(models.Manager): 
    def get_by_natural_key(self, param): 
     qs = self.get_queryset() 
     if param == "*": 
      return self.all() 
     lookup = {qs.model.NATURAL_KEY: param} 
     return self.get(**lookup) 

通用Model类:

class NexchangeModel(models.Model): 
    class Meta: 
     abstract = True 
    objects = NexchangeManager()