Ke starším modelům můžete přidat některé metody a získat související položky o něco efektivněji:
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 pokud to není naposledy, co s těmito daty pracujete, pravděpodobně lepší způsob je definovat běžné modely django pomocí fks a napsat jednou skript pro převod starších dat do nové struktury modelu. Výzva by neměla trvat déle než hodinu.
AKTUALIZACE
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)