2017-08-23 18 views
-1

モデルに関係なく、同じモデルを継承する2つのバージョンの要素間にOneToOne関係のカスタムリレーションテーブルが必要です。ここでは、モデルと関係モデルがあります。私はアンサンブルモデルのマネージャーにアクセスしようとすると、m2m_reverse_name_cacheを定義する方法は?

class Ensemble(models.Model): 
    name = models.CharField("Nom", max_length=50) 
    version = models.CharField("Version", max_length=10, blank=True, default=None, null=True) 
    parent_version = models.OneToOneField("self",verbose_name="Version du parent", 
             default=None, blank=True, null=True, related_name="children_version", unique=False) 
    version_up = models.ManyToManyField('Ensemble', through='Version_up', symmetrical=False, blank=True, related_name='version_up_set') 

class Version_up(models.Model): 
    child_element = models.ForeignKey(ContentType ,on_delete=models.CASCADE, blank=True, null=True, related_name="child_element") 
    parent_element = models.ForeignKey(ContentType, on_delete=models.CASCADE, blank=True, null=True, related_name="parent_element") 
    description = models.TextField(max_length=1000, verbose_name="Commentaires", default=None, blank=True, null=True) 
    child_id = models.PositiveIntegerField() 
    parent_id = models.PositiveIntegerField() 
    child_content = GenericForeignKey('child_element' ,'child_id') 
    parent_content = GenericForeignKey('parent_element', 'parent_id') 

はしかし、私はこのエラーを得た:{AttributeError}'ManyToManyField' object has no attribute '_m2m_reverse_name_cache'

私はAttributeError: 'ManyToManyField' object has no attribute '_m2m_reverse_name_cache'にこの記事を読んだが、私は必要があるとして、それは、私の問題には適用されません。関係に関する余分なデータを格納する。助けを前にありがとう。以下は

はエラーをトリガ図である。

def validate_form_ensemble(elem_id, request): 
    """ 
    :param elem_id: 
    :param request: 
    :return: 
    """ 
    instance = Ensemble.objects.get(id=elem_id) 
    form = EnsembleForm(QueryDict(request.POST.get('form')),instance=instance) 
    if form.errors: 
     form = EnsembleForm(custom_decode(QueryDict(request.POST.get('form')), Ensemble)) 
    if form.is_valid(): 
     form.save() 
     response = 'Ensemble enregistré' 
    else: 
     response = form.errors 
    return response 

そして、ここでは完全なトレースバックです。

Internal Server Error: /Syc/update_elem/EN/31 
Traceback (most recent call last): 
    File "C:\Program Files (x86)\Python\lib\site-packages\django\core\handlers\exception.py", line 41, in inner 
    response = get_response(request) 
    File "C:\Program Files (x86)\Python\lib\site-packages\django\core\handlers\base.py", line 249, in _legacy_get_response 
    response = self._get_response(request) 
    File "C:\Program Files (x86)\Python\lib\site-packages\django\core\handlers\base.py", line 187, in _get_response 
    response = self.process_exception_by_middleware(e, request) 
    File "C:\Program Files (x86)\Python\lib\site-packages\django\core\handlers\base.py", line 185, in _get_response 
    response = wrapped_callback(request, *callback_args, **callback_kwargs) 
    File "C:/Users/USER/Documents/Projet/Sycoma\Syc\views\views_utils.py", line 676, in _wrapped_view 
    return view(request,*args,**kwargs) 
    File "C:/Users/USER/Documents/Projet/Sycoma\Syc\views\ajax_views.py", line 182, in update_elem 
    response = validate_form_ensemble(elem_id, request) 
    File "C:/Users/USER/Documents/Projet/Sycoma\Syc\views\views_utils.py", line 564, in validate_form_ensemble 
    form = EnsembleForm(QueryDict(request.POST.get('form')),instance=instance) 
    File "C:\Program Files (x86)\Python\lib\site-packages\django\forms\models.py", line 287, in __init__ 
    object_data = model_to_dict(instance, opts.fields, opts.exclude) 
    File "C:\Program Files (x86)\Python\lib\site-packages\django\forms\models.py", line 96, in model_to_dict 
    data[f.name] = f.value_from_object(instance) 
    File "C:\Program Files (x86)\Python\lib\site-packages\django\db\models\fields\related.py", line 1683, in value_from_object 
    return getattr(obj, self.attname).all() 
    File "C:\Program Files (x86)\Python\lib\site-packages\django\db\models\fields\related_descriptors.py", line 513, in __get__ 
    return self.related_manager_cls(instance) 
    File "C:\Program Files (x86)\Python\lib\site-packages\django\db\models\fields\related_descriptors.py", line 803, in __init__ 
    self.target_field_name = rel.field.m2m_reverse_field_name() 
    File "C:\Program Files (x86)\Python\lib\site-packages\django\utils\functional.py", line 15, in _curried 
    return _curried_func(*(args + moreargs), **dict(kwargs, **morekwargs)) 
    File "C:\Program Files (x86)\Python\lib\site-packages\django\db\models\fields\related.py", line 1617, in _get_m2m_reverse_attr 
    return getattr(self, cache_attr) 
+0

私は確かに、コードに悪い習慣があることを確信しています。たとえば、related_nameを使用している場合は、教えてください。 –

+0

このコードでは問題はありません。 Ensembleモデルのマネージャにアクセスする方法を正確に*表示する。 –

+0

'EnsembleForm(request.POST.get( 'form')、instance = instance)'のようなインスタンスでモデルフォームを作成しようとしたときにこのエラーが発生しましたが、Ensemble.version_up_setにアクセスするためにシェルで試しました。 –

答えて

0

私はまだこの問題の解決策を見つけましたが、ここでの回避策でいない:

instance=elem_model.objects.get(pk=elem_id) 
    try: 
     form = ModelForm(data, instance=instance) 
    except AttributeError: 
     form = ModelForm(data) 
     form.instance = instance 

そして、他の例の代わりに、私はちょうど関係テーブルのインスタンスを使用して、私のモデルマネージャを使用するための

関連する問題