2016-12-12 12 views
2

미리 도움을 주셔서 감사합니다. 마일 프로젝트 내 기존 데이터베이스에서 생성 된 모델을 포함하는 응용 프로그램이 있습니다. 이러한 테이블은 DBA에서 관리하므로 관리되지 않는 모델로 유지됩니다. 스키마 변경으로 인해 db에서 모델을 다시 생성 할 필요가있을 수 있으므로 각 모델에 대해 대체 프록시 모델을 작성하여 관리하지 않는 부분과 그렇지 않은 부분을 분리합니다. 아래에서 현재 레이아웃을 기반으로 한 예를 볼 수 있습니다.장고 1.10 - makemigrations 명령으로 관리되지 않는 모델의 변경 내용을 감지하지 못합니다.

이 예에서는 생성 된 모델과 생성 된 다른 모델을 FK로 표시하므로 프록시 모델에는 비 프록시 모델에 대한 참조가 있습니다. 나는 here을 가리키는 토론을 읽고 표시된 접근법 중 일부를 시도했다. 그러나 그들 중 누구도 나를 위해 일하지 못했다. 그래서 지금은 생성 된 모델을 프록시 1을 가리 키도록 업데이트하려고합니다. 프록시는 문제를 야기해서는 안된다고 생각합니다.

Django가 관리되지 않는 모델의 마이그레이션을 생성 한 것을 보았으므로 makemigration이 해당 모델의 FK 변경을 감지 할 것이라고 생각했습니다. 그러나 manage.py makemigrations을 실행하면 변경 사항이 발견되지 않았 음을 알 수 있습니다. 관리되지 않는 모델에 대한 makemigrations의 예상되는 동작입니까?

# app/models.py 
class SacLocation(models.Model): 
    sacloc_location_id = models.IntegerField(primary_key=True) 
    sacloc_name = models.CharField(max_length=50, blank=True, null=True) 
    sacloc_state = models.IntegerField(blank=True, null=True) 

    # I'm changing this Field to point to the proxy model 
    # e.g. it will look like this, but the change is not detected by makemigrations 
    # sacloc_location_grouping = models.ForeignKey('LocationGroupingProxy', 
    #   models.DO_NOTHING, db_column='sacloc_location_grouping') 
    sacloc_location_grouping = models.ForeignKey('SacLocationGrouping', 
       models.DO_NOTHING, db_column='sacloc_location_grouping') 

    class Meta: 
     managed = False 
     db_table = 'sac_location' 


class SacLocationGrouping(models.Model): 
    saclgr_location_grouping__id = models.IntegerField(primary_key=True) 
    saclgr_name = models.CharField(max_length=50, blank=True, null=True) 

    class Meta: 
     managed = False 
     db_table = 'sac_location_grouping' 


class LocationProxy(SacLocation):   
    class Meta: 
     proxy = True 

    def __str__(self): 
     return u'%s' % (self.sacloc_name) 


class LocationGroupingProxy(SacLocationGrouping): 
    class Meta: 
     proxy = True 

    def __str__(self): 
     return u'%s' % (self.saclgr_name) 

답변

0

나는 원래 FK 다른 관리되지 않는 모델, 프록시 모델 관리되지 않는 모델을 가리 키도록 내 코드에 몇 가지 변화를 만들었습니다. 이러한 변경으로 인해 새로운 마이그레이션이 생성되지 않았으므로 예상 된 동작이이 경우에 해당한다고 가정합니다. Django 소스 코드를 보았지만이 변경 사항이 감지되면 해당 위치를 찾지 못했습니다. 마지막으로 프록시 모델에서 Meta 옵션 (예 : 주문)을 변경했을 때 Django는 변경 사항을 실제로 감지하고 새로운 이전을 만들었습니다.