2016-11-25 10 views
1

のクラスを取得し、私はのManyToManyFieldの空のクエリセットを返すために必要がありますが、私は 受信「はAttributeError: 『をReverseManyRelatedObjectsDescriptor』オブジェクトが 『どれも』は属性を持っていない」は、以下の単純化モデルを考えるのManyToManyField

class AnimalFamily(models.Model): 
    objects = GetOrNoneManager() 
    siblings = objects.none() 


class Countable(models.Model): 
    @classmethod 
    def get_peers(cls_obj,target_animal): 
    animals = cls_obj.objects.get_or_none(siblings=target_animal) 
    if animals: 
     return animals.siblings.exclude(id=target_animal.id) 
    else 
     return cls_obj.siblings.none() # <--- this fails <---- 

    class Meta: 
    abstract = True 


class BearFamily(AnimalFamily,Countable): 
    siblings = models.ManyToManyField(Bear) 

class GiraffeFamily(AnimalFamily,Countable): 
    siblings = models.ManyToManyField(Giraffe) 


class Bear(models.Model): 
    pass 

class Giraffe(models.Model): 
    pass 

ジェネリッククラスメソッドの "Bear" -Classまたはそれぞれの "Giraffe" -Classにアクセスして、正しいQuerySetの空のクエリを返すにはどうしたらいいですか?

追加情報:

# dir(cls_obj.siblings) returns: 
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__get__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__set__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'field', 'related_manager_cls', 'through'] 

答えて

2

エラーメッセージが明確にあなたが戻ってきているオブジェクトが「なし」という名前のない無属性を持っていないという問題を指します。私は、空のクエリセットまたは(BearFamilyの空のクエリセットになります)cls_objの空のリストを捜しているわけではないので、悲しいことに、これは助けない

if animals: 
    return animals.siblings.exclude(id=target_animal.id) 
else 
    cls_obj.siblings = [] 
    return cls_obj.siblings 
+0

ではなく、空のクエリセットの:これは何をしたい、おそらくですManyToManyフィールドで参照されるクラス(空のBearまたはGiraffeクエリーセット)。 'Bear.objects.none()'は空のクエリーセットを返すので、これらが存在することはわかっています。クマはもう一つのdjangoクラスです(これを私のコード例に追加して、それをさらに明確にします) – gimili

+0

これを正しく理解していれば、クエリーに動物がない場合、クエリーセットを空として定義しようとしています目的の動物と一致する。その場合、基本クラス(AnimalFamily)に空のクエリセットを設定する必要はありませんが、その操作を子に移動する必要はありません。その場合、基本クラス定義は次のようになります:class AnimalFamily(models.Model): #objects = GetOrNoneManager()djangoメソッド名をクラス属性として使用して混乱を招きます 兄弟= objects.none ) – postoronnim

+0

これは基本クラスのコードです: – postoronnim

関連する問題