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), )()
Exemple #2
0
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()()