Welcome | Get started | Dive | Contribute | Topics | Reference | Changes | More

Why Lino doesn’t use ManyToManyField

The ManyToManyField is an anti-feature.

Here is a classical use case:

class Topic(Model):
  name = CharField()

class Person(Model):
  topics = ManyToManyField(Topic)

We have persons and topics, and we want to say things like “Person X is interested in topics Y and Z” and “Person Foo is interested in topics Bar”

Django creates an automatic invisible table “PersonTopic” to store each “checked” topic on a person.

https://docs.djangoproject.com/en/5.0/topics/db/examples/many_to_many/

Usually it happens that you must extend an m2m field using the through keyword.

In Lino we prefer to say:

class Topic(dd.Model):
  name = CharField()

class Person(dd.Human):
  topics = ManyToManyField(Topic)

class Interest(dd.Model):
  topic = ForeignKey(Topic, related_name="interests_by_topic")
  person = ForeignKey(Person, related_name="interests_by_person")

class InterestsByPerson(dd.Table):
  model = "Interest"
  master_key = "person"

class InterestsByTopic(dd.Table):
  model = "Interest"
  master_key = "topic"

class Persons(dd.Table):
  detail_layout = """
  first_name last_name
  InterestsByPerson
  """

class Product

specs = m2mfield(Spec)

class ProductSpec:

product = ForeignKey(Product) spec = ForeignKey(Spec)

SpecsByProduct(Table):

model = “ProductSpec” master_key = ‘product’ insert_layout = “”” spec spec__name “””

UsagesBySpecs(Table):

model = “ProductSpec” master_key = ‘spec’

ProductDetail = “”” SpecsByProduct “””