nick,
Thanks for the response.
Here's a longer explanation.
Two applications, one is purchasing, the other is production.
Purchasing has two tables, purchase_orders and product_lots. It's a
one-to-may relationship; a purchase order can have many product lots. So
we get:
db.define_table('purchase_orders', field('po_number' .....
db.define_table('product_lots', Field('purchase_order_id',
db.purchase_orders, requires=IS_IN_DB(db, 'purchase_orders.id', ...)),
Field('quantity_received', 'decimal'), Field('quantity_on_hand',
'decimal') ...
So, I have established a foreign table relationship between purchase orders
and product lots.
Once a product_lot is released to production, the production app uses the
same table to find available raw materials, and decrements the
quantity_on_hand field as it goes. The production app neither knows nor
cares about the purchase order table, so the purchase_order_id field is
irrelevant.
This is fine as long as all production material enters the plant via the
purchasing process. However, this is not the case. So, either I devise a
way to get records into the product lots table without violating the
foreign key constraint that Postgres would apply. One way would be to
define the purchase_order_id field as an integer and handle the key
relationships through code. Not attractive.
Another way would be to establish a third table for raw materials. This
would be a clone of the product_lots table but it would not have a foreign
key to purchase_orders. The purchase_order controller would then need to
create and update records in the raw materials table, while several
controllers in the production app would also create and update records in
the table as well. I don't like this solution much, either.
Can anybody suggest another approach?
On Thursday, April 19, 2012 1:03:41 PM UTC-4, nick name wrote:
>
> I don't understand what you are trying to achieve, but whatever it is, you
> are doing it wrong; your model should be:
>
> db.define_table('A', Field('name'))
>
> db.define_table('B', Field('name'), Field('id_from_table_a', 'reference
> A'))
> # alternatively:
> # db.define_table('B', Field('name'), Field('id_from_table_a', db.A))
>
> This would create the foreign key reference, and would allow nulls by
> default (which is what your condition does).
>
> But as I said, I'm not sure exactly what you are trying to achieve?
>
> On Wednesday, April 18, 2012 7:11:42 PM UTC-4, Cliff wrote:
>>
>> There are two tables, as follows:
>>
>> db.define_table('A', Field('name'))
>>
>> db.define_table('B', Field('name'), Field('id_from_table_a))
>>
>> Also there are two applications. One, called 'both_a_and_b', uses both
>> tables and uses 'table_a_id' as a foreign key in table B. The other,
>> called 'table_b_only' needs CRUD access to the information in table B, but
>> it is not able to supply a value for 'id_from_table_a.'
>>
>> I think because Postgres recognizes foreign key constraints,
>> 'table_b_only' will not be able to create records in table B.
>>
>> What Is the right solution?
>>
>> I can think of two. First, create a third table, C, for all the data
>> that 'table_b_only' needs. This table would not have the 'id_from_table_a'
>> field. The other application would need to write also to this table
>> whenever it creates a record in table B.
>>
>> A second possibility might be to define table B this way:
>> db.define_table('B',
>> Field('name') ,
>> Field('id_from_table_a', requires= IS_EMPTY_OR(IS_IN_DB(db, 'A.id',
>> ...)))
>> )
>>
>> I would be grateful for any guidance,
>> Cliff Kachinske
>>
>