class A(models.Model): key = models.IntegerField(primary_key=True) field1 = models.IntegerField(null=True) field2 = models.IntegerField(null=True) field3 = models.IntegerField(null=True) is_deleted = models.BooleanField(null=True) class Meta: managed = False outer_join = WritableOuterJoin( A1, A0, on='key', ) objects = outer_join.get_manager(filter_initial_queryset=exclude_exact( 'is_deleted', True), )() readonly_outer_join = OuterJoin( A1, A0, on='key', ) all_objects = readonly_outer_join.get_manager()() deleted_objects = readonly_outer_join.get_manager( filter_initial_queryset=filter_exact('is_deleted', True), )()
class A(models.Model): # Manual key must be used for outer-join models with a relation # (except through models in m2m relations that are not used directly) # However, base tables don't have this restriction key = models.IntegerField(primary_key=True) b = models.ForeignKey( B, related_name='a_set', on_delete=models.CASCADE, ) val = models.IntegerField() is_deleted = models.BooleanField(null=True) class Meta: managed = False # IMPORTANT: base manager must be specified for any outer-join model with a relation # base manager should not have an initial filter base_manager_name = 'base_objects' outer_join = WritableOuterJoin( A1, A0, on='key', ) objects = outer_join.get_manager(filter_initial_queryset=exclude_exact( 'is_deleted', True), )() base_objects = outer_join.get_manager()()
class B(models.Model): key = models.IntegerField(primary_key=True) val = models.IntegerField(null=True) is_deleted = models.BooleanField(null=True) class Meta: managed = False base_manager_name = 'base_objects' outer_join = WritableOuterJoin( B1, B0, on='key', ) objects = outer_join.get_manager(filter_initial_queryset=exclude_exact( 'is_deleted', True), )() base_objects = outer_join.get_manager()()
class A(models.Model): key = models.IntegerField(primary_key=True) b = models.ForeignKey( B, related_name='a_set', on_delete=models.CASCADE, db_constraint=False, ) val = models.IntegerField() is_deleted = models.BooleanField(null=True) class Meta: managed = False base_manager_name = 'base_objects' outer_join = WritableOuterJoin( A1, A0, on='key', ) objects = outer_join.get_manager( filter_initial_queryset=exclude_exact('is_deleted', True), )() base_objects = outer_join.get_manager()()
class Through(models.Model): _save_check_fields = ( 'a', 'b', ) a = models.ForeignKey( A, related_name='+', on_delete=models.CASCADE, db_constraint=False, ) b = models.ForeignKey( B, related_name='+', on_delete=models.CASCADE, db_constraint=False, ) is_deleted = models.BooleanField(null=True) class Meta: unique_together = (('a', 'b'), ) managed = False base_manager_name = 'base_objects' outer_join = WritableOuterJoin( Through1, Through0, on=['a', 'b'], ) primary_key = outer_join.get_primary_key()() objects = outer_join.get_manager(filter_initial_queryset=exclude_exact( 'is_deleted', True), )() base_objects = outer_join.get_manager()()
class A(models.Model): key = models.IntegerField(primary_key=True) b_set = models.ManyToManyField( B, related_name='a_set', through='Through', ) val = models.IntegerField() is_deleted = models.BooleanField(null=True) class Meta: managed = False base_manager_name = 'base_objects' outer_join = WritableOuterJoin( A1, A0, on='key', ) objects = outer_join.get_manager(filter_initial_queryset=exclude_exact( 'is_deleted', True), )() base_objects = outer_join.get_manager()()