Django Best Practice for Handling Related Model Objects Between Apps <p>I have a project that has 2 different apps. One handles a site's performance metrics and the other estimates site's workload. The workload app has some dependencies on the performance app. However, I am trying to avoid creating a dependency from the metrics app to the workload app in order to better encapsulate the metrics app as stand-alone. For example, metrics has this model:</p> <pre><code># models.py in metrics app: class Site(models.Model): site_name = models.CharField(max_length=255) site_geography = models.CharField(max_length=255) slug = AutoSlugField(populate_from='site_name', unique=True, null=True) </code></pre> <p>Workload app has objects such as (some omitted for brevity):</p> <pre><code># models.py in workload app: class Resource (models.Model): name_first = models.CharField(max_length=60) name_last = models.CharField(max_length=60) address_street = models.CharField(max_length=80, blank=True) address_city = models.CharField(max_length=40, blank=True) address_state = models.CharField(max_length=2, blank=True) sites = models.ManyToManyField(metrics_models.Site, through='ResourceSiteRelationship', blank=True, related_name='resources') class Activity (models.Model): activity_name = models.CharField(max_length=255) hours = models.DecimalField(max_digits=5, decimal_places=2) travel = models.BooleanField() description = models.TextField(blank=True) class ResourceSiteRelationship (models.Model): roles = models.ManyToManyField(Role, blank=True, related_name='resource_site_relationships') resource = models.ForeignKey(Resource, on_delete=models.CASCADE, blank=True, null=True, related_name='resource_site_relationships') site = models.ForeignKey(metrics_models.Site, on_delete=models.CASCADE, blank=True, null=True, related_name='resource_site_relationships') </code></pre> <p>Site should also have the following field relationship:</p> <pre><code>activities = models.ManyToManyField(Activity, related_name='sites', blank=True) </code></pre> <p>Is it best to add that field to the metric's app's instance of Site? Is it better to create a one-to-one class for Site in the workload app and extend like so:</p> <pre><code>class Site(models.Model): site = models.OneToOneField(metrics_models.Site, on_delete=models.CASCADE) activities = models.ManyToManyField(Activity, related_name='sites', blank=True) </code></pre> <p>Or is there another way to do this?</p>