Skip to content

Instantly share code, notes, and snippets.

@Afnarel
Last active March 18, 2022 15:43
Show Gist options
  • Save Afnarel/31f717d374530172017f803115791373 to your computer and use it in GitHub Desktop.
Save Afnarel/31f717d374530172017f803115791373 to your computer and use it in GitHub Desktop.
class EditorialContent(BaseModel):
	relational_program_contents = GenericRelation(RelationalProgramContent)

class Vendor(BaseModel):
	relational_program_contents = GenericRelation(RelationalProgramContent)

class RelationalProgram(BaseModel):
	...

class RelationalProgramContent(BaseModel):
    relational_program = models.ForeignKey(RelationalProgram, related_name="contents")
    content = GenericForeignKey()


relational_program = RelationalProgram.objects.first()
editorial_content = EditorialContent.objects.first()

1) Pour récupérer tous les contenus éditoriaux liés à un programme relationnel :

Sans GM2M

editorial_content_ct = ContentType.objects.get(app_label='program_cotnent_manager', model='editorial_content')
editorial_contents_ids = relational_program.contents.filter(content_type=editorial_content_ct).values_list("object_id", flat=True)
editorial_contents = EditorialContent.objects.filter(pk__in=editorial_contents_ids)
EditorialContent.objects.filter(relational_program_contents__relational_program=relational_program)

Avec GM2M

editorial_contents = relational_program.contents.filter(Model=EditorialContent)  # Possible d'utiliser .filter(Model__in=[EditorialContent, Vendor]) pour récupérer plusieurs types

2) Pour récupérer tous les contenus (contenus éditoriaux, vendors, etc.) liés à un programme relationnel :

Sans GM2M

contents = []
contents_types_ids = relational_program.contents.values_list("content_type", flat=True)  # Ou liste en dur
for content_type_id in content_type_ids:

Avec GM2M

contents = relational_program.contents

3) Pour récupérer les programmes relationnels depuis un contenu éditorial

Sans GM2M

relational_programs_ids = editorial_content.relational_program_contents.values_list("relational_program", flat=True)
relational_programs = RelationalProgram.objects.filter(pk__in=relational_programs_ids)
RelationalProgram.objects.filter(contents__content=editorial_content)

Avec GM2M

relational_programs = editorial_contents.relational_programs
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment