Mysql
 sql >> база данни >  >> RDS >> Mysql

Как да боравим с наследена база данни в рамката на Django

Можете да добавите някои методи към наследени модели, за да извлечете свързани елементи малко по-ефективно:

class Listflower(models.Model):
    especies_id = models.AutoField(primary_key=True)
    family_id = models.IntegerField(blank=True, null=True)
    especies = models.CharField(max_length=255, blank=True, null=True)
    

    class Meta:
        managed = False
        db_table = 'listflower'

    def get_family(self):
        return FamilyModel.objects.get(family_id=self.family_id)


class Estate(models.Model):
    estate_id = models.AutoField(primary_key=True)
    estate_name = models.CharField(max_length=100, blank=True, null=True)
 

    class Meta:
        managed = False
        db_table = 'estates'

    def get_flowers(self):
        flower_ids = Flower2Estate.objects.filter(estate_id=self.estate_id).values_list('especies_id', flat=True)
        return Listflower.objects.filter(especies_id__in=flower_ids)

Но ако това не е последният път, когато работите с тези данни, вероятно по-добрият начин е да дефинирате обикновени django модели с fks и да напишете веднъж скрипт за конвертиране на наследени данни в нова структура на модела. Предизвикателството не трябва да отнема повече от час.

АКТУАЛИЗИРАНЕ

class FlowerFamily(models.Model):
    # assuming you old family model has 
    # "family_id" and "family_name" fields
    family_id = models.IntegerField(blank=True, null=True)
    family_name = models.CharField(max_length=255, blank=True, null=True)


class Flower(models.Model):
    # you might want preserve old model fields in the new model
    # at least id fields
    especies_id = models.IntegerField(blank=True, null=True)
    family_id = models.IntegerField(blank=True, null=True)
    especies = models.CharField(max_length=255, blank=True, null=True)

    family = models.ForegnKey(FlowerFamily, related_name='flowers')


class NewEstate(models.Model):
    estate_id = models.IntegerField(blank=True, null=True)
    estate_name = models.CharField(max_length=100, blank=True, null=True)
    flowers = models.ManyToManyField(Flower, related_name='estates')




# this is a slightly primitive example
# in real life you might want to use get_or_create instead of direct creation 
# in case script fails and you'll need to run it again
# also objects.get() might better be used with try-except ObjectDoesNotExist
def convert_legacy():
    # create new instances
    for ff in YourOldFamilyModel.objects.all():
        new_ff = FlowerFamily(family_id=ff.family_id, family_name=ff.family_name)
        new_ff.save()

    for fl in Listflower.objects.all():
        new_fl = Flower(...)

        family = FlowerFamily.objects.get(family_id=fl.family_id)

        new_fl.family = family
        new_fl.save()
    
    # same thing for Estate
    for ...:
        new_estate ...
        new_estate.save()

        # and restore relations
        flower_ids = Flower2Estate.objects.filter(estate_id=new_estate.estate_id).values_list('especies_id', flat=True)

        for new_lf in Flower.objects.filter(especies_id__in=flower_ids):
            new_estate.flowers.add(new_fl)
        
    
    



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да съхранявате Java Instant в MySQL база данни

  2. Може ли някой да обясни подробно функцията за индексиране на Magentos?

  3. как да свържете две колони в една със съществуващото име на колона в mysql?

  4. Метеор с mysql

  5. Как да създадете модул за предстоящи рождени дни в Rails?