Monday, September 3, 2012

Re: Is the logic in my model correct? Best-case?

On Mon, 3 Sep 2012 18:51:45 -0700 (PDT), Barry Morrison
<bdmorrison@gmail.com> declaimed the following in
gmane.comp.python.django.user:

> Model: http://dpaste.org/dqwmc/
>
> There can be many products.

Okay, a table of products...

> There can be many distributors.

and a table of distributors

> A product could have none or more distributors.

Normal intersect table behavior

> A distributor could only distribute a single product once.

This clause is unclear...

> A distributor could distribute all products.
>

This clause is irrelevant -- it doesn't restrict the data (vs if you
had some requirement that a distributor carrying products a..m is not
allowed to carry product n)

> I imagine a form (admin side):
>
> Product Name:
> Product Description:
> Product Image:
>
> Distributor 1: Radio Field/Boolean
> Distributor 2: Radio Field/Boolean
> Etc. etc.
>
> For some reason I can't wrap my head around this.

Your model (per the linked web page) current ties a product instance
to ONE DISTRIBUTOR ONLY.

In pseudo-SQL, you have defined

create table Distributor
(
ID integer autoincrement primary key, #django adds this
Name varchar(255) not null, #it is redundant to preface fields
#with "distributor" when they are
#IN the table Distributor
URL varchar(255) null, #URL type is django operation
Product boolean #this field is meaningless as
#there is no product referenced
#here
);

create table Product
(
ID integer autoincrement primary key,
Name varchar(255) not null,
Description blob, #or some such large text field
Image varchar(255) null, #image type is django usage
Distributor integer foreign key references Distributor (ID),
#this basically says that this product can have
#only ONE distributor
);

What you really need is not a one-to-many link (one distributor can
have many products, but each product can only have one distributor) but
a many-to-many linkage.

create table Distributor
(
ID integer autoincrement primary key, #django adds this
Name varchar(255) not null,
URL varchar(255) null,
);

create table Product
(
ID integer autoincrement primary key,
Name varchar(255) not null,
Description blob, #or some such large text field
Image varchar(255) null, #image type is django usage
);

create table ProductDistribution
(
ID integer autoincrement primary key,
ProductID integer foreign key references Product(ID),
DistributorID integer foreign key references Distributor(I),
unique (ProductID, DistributorID)
);

As I understand it, Django will create the equivalent of
ProductDistribution when you declare a many-to-many relationship in one
of the parent tables.

--
Wulfraed Dennis Lee Bieber AF6VN
wlfraed@ix.netcom.com HTTP://wlfraed.home.netcom.com/

--
You received this message because you are subscribed to the Google Groups "Django users" group.
To post to this group, send email to django-users@googlegroups.com.
To unsubscribe from this group, send email to django-users+unsubscribe@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/django-users?hl=en.

No comments:

Post a Comment