Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jak obsługiwać starszą bazę danych we frameworku Django

Możesz dodać kilka metod do starszych modeli, aby nieco wydajniej pobierać powiązane elementy:

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)

Ale jeśli nie jest to ostatni raz, kiedy pracujesz z tymi danymi, prawdopodobnie lepszym sposobem jest zdefiniowanie zwykłych modeli django za pomocą fks i napisanie raz skryptu konwertującego starsze dane do nowej struktury modelu. Wyzwanie nie powinno zająć więcej niż godzinę.

AKTUALIZUJ

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. MySQL NIE W zapytaniu

  2. Łączenie się z bazami danych MySQL

  3. Jak utrzymywać sesje PHP w wielu domenach na tym samym serwerze?

  4. Jak uzyskać typy liczbowe z MySQL za pomocą PDO?

  5. MySQL dodaje 12 godzin do pola czasu