0
votes

In my Django models, I have two models : one called Site and the other SiteFeature.

Object-wise, it is very clear how this should work : every instance of the Site class should have as property a list containing instances of the SiteFeature class, simply because the SiteFeature objects should only exist in relation to a Site object.

Database-wise, it is also very clear how it should work : the SiteFeature table should contain a not-nullable column referencing the primary key id column of the Site table, with a foreign key.

But in terms of Django ORM, I don't know how to code this.

Based on this question, and this other example, it seems the classical way to proceed works the other way round :

  • The Site model class contains no ORM model field referencing the SiteFeature list.
  • Instead, the SiteFeature ORM model class has a ForeignKey field referencing the Site class.

I see there is a way to code this out : by adding a function to the Site model class that searches all the related SiteFeature, and make this function a property (decorator @property):

@property
def site_features(self):
    return SiteFeature.objects.filter(site_id=site_id)

But that leaves me doubts :

The proper logic for me would also be that when I save, update or create an instance of the Site class, it would also automatically save / update / create the instances of SiteFeature that are related to it. (same thing for deleting the object, but that can be covered by the on_delete=models.CASCADE parameter of the ForeignKey field). I could add my own save_with_features / update_with_features / create_with_features methods that cascade all but I am not sure what would happen in case of calls made automatically by Django to the standard save / update / create such as in bulk operations.

This problem seems to basic that I suppose there is already a proper way to do it. How would that be ?

1

1 Answers

0
votes